Edited at

openframeworksで動画のフェード

More than 3 years have passed since last update.


経緯

動画の取り扱い時、アルファのついてる動画以外にmp4同士の動画をきれいに繋ぎたいなどをシェーダー使わず手軽?に実装するときのやり方


アドオン

なし!


実装

void setup(){

//load and play movie1
movie1.load("movie001.mp4");//動画はprojectDirectory/bin/data内
movie1.setLoopState(OF_LOOP_NORMAL);
movie1.play();

//load and play movie2
movie2.load("movie002.mp4");
movie2.setLoopState(OF_LOOP_NONE);
movie2.play();

increment = 0.09f; //フェードインのスピード、係数的な
decrement = -0.09f;//フェードアウトのスピード、係数的な
alphaBlend1 = 1.0; //動画の不透明度
alphaBlend2 = 0.0;
movieSwitch=false;//フェードスタートフラグ
}

void update(){
if(movieSwitch){
movie2.update();
if (movie2.getPosition()<0.8) {
alphaBlend2 += increment; //movieスタートしてから8割進むまではアルファ値を増加
if (alphaBlend2>1.0) {
alphaBlend2=1.0; //1.0を超えても増加してしまうので超えたら固定する
}
}
}
if (movie2.getPosition() >0.88) { //数値は自由に変更して下さい。9割再生ぐらいでアルファ値減少
if (alphaBlend2>0.0) {
alphaBlend3 += decrement;
if (alphaBlend2<0.0) {
alphaBlend2=0.0; //増加と同じくマイナス行き過ぎるので固定化
movieSwitch = false;
}
}
}

}
void draw(){
ofSetColor(255*alphaBlend1);
movie1.draw(0,0);

ofSetColor(255*alphaBlend2);
movie2.draw(0,0);

}

的な感じでマウスクリックかキーボード入力かなにかしら入力でmovieSwitchを点火して動作させてる感じです。

movie2の動画再生が終わったら勝手に戻るように設定しているのでループさせてスイッチで切り替えたいようであればそのへんは変更して下さい。

incrementとdecrementの数値でフェードの長さを調整できます。