Last active
October 24, 2022 18:58
-
-
Save sport4minus/625308abafe617456a504d4160ffd498 to your computer and use it in GitHub Desktop.
Crossfade two videos on Raspberry Pi /w omxplayer and node.js using omxplayer-controll
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
crossfade-videos.js by github.com/sport4minus | |
test based on omxplayer-controll example by github.com/winstonwp | |
– crossfade two videos on raspberry pi using node.js, omxplayer-controll https://github.com/winstonwp/omxplayer-controll and omxplayer. | |
– working based on omxplayer's capability to set a video render layer. | |
– two instances of omxplayer are started on different layers, the upper ones' alpha is changed during runtime. | |
- this example uses two hypothetical videos named movie.mov and other_movie.mov which are in the same directory as the .js file | |
- tested on raspberry pi 3 | |
*/ | |
// foreground movie | |
var omxp = require('omxplayer-controll'); | |
var alpha = 255; | |
var opts = { | |
'audioOutput': 'hdmi', // 'hdmi' | 'local' | 'both' | |
'blackBackground': false, //false | true | default: true | |
'disableKeys': true, //false | true | default: false | |
'disableOnScreenDisplay': true, //false | true | default: false | |
'disableGhostbox': true, //false | true | default: false | |
'subtitlePath': '', //default: "" | |
'startAt': 0, //default: 0 | |
'startVolume': 0.8, //0.0 ... 1.0 default: 1.0 | |
'layer': 3 // selects video render layer 3, which is on top of layer 2, naturally | |
}; | |
omxp.open('movie.mov', opts); | |
omxp.on('aboutToFinish',function(){ | |
console.log('File about to finish'); | |
}); | |
//background movie | |
var omxp1 = require('omxplayer-controll'); | |
var opts1 = { | |
'audioOutput': 'hdmi', // 'hdmi' | 'local' | 'both' | |
'blackBackground': false, //false | true | default: true | |
'disableKeys': true, //false | true | default: false | |
'disableOnScreenDisplay': true, //false | true | default: false | |
'disableGhostbox': true, //false | true | default: false | |
'subtitlePath': '', //default: "" | |
'startAt': 0, //default: 0 | |
'startVolume': 0.8, //0.0 ... 1.0 default: 1.0 | |
'layer': 2 //selects video render layer 2, which is.. beneath layer 3. | |
}; | |
omxp1.open('other_movie.mov', opts1); | |
//crossfade back and forth by alpha value of 5 every frame (nextTick) | |
var fadeSpeed = 5; | |
function fadeIn(){ | |
if(alpha < 255){ | |
omxp.setAlpha(alpha, function(err){console.log(err)}); | |
alpha += fadeSpeed; | |
process.nextTick(fadeIn); | |
} else { | |
process.nextTick(fadeOut); | |
} | |
} | |
function fadeOut(){ | |
if(alpha > 0){ | |
omxp.setAlpha(alpha, function(err){console.log(err)}); | |
alpha -= fadeSpeed; | |
process.nextTick(fadeOut); | |
} else { | |
process.nextTick(fadeIn); | |
} | |
} | |
//fading begins 5 seconds after initializing the script, as omxplayer instances may not be ready yet. | |
setTimeout(fadeOut, 5000); |
Hi - could this code fade 2 videos with 1920x1080 30fps in 2021?
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Hello @ArosPrince,
sorry for seeing this just now.
This actually worked for me, yes. I will look up what system i used, and let you know.
(FYI my video files were of a 1280x720 resolution, at some other occasion i was under the impression that higher-res didn't go as smoothly, but this might be also related to setting this up a year later/new raspian... )