FFmpegフィルター:写真とビデオストリームの作成(続き)

1年前に、FFmpegを使用して画像ビデオストリームを作成することについての記事を書きまし。一般的な考え方は、最初に1つの画像を3秒のビデオファイルに変換し、次にビデオの最初と最後にフェードインとフェードアウトの効果を追加することです。 ;各画像がこのように処理された後、すべての小さなビデオファイルが接続され、1つの大きなビデオファイルにマージされます。アイコン:

この方法は比較的初歩的です!今日はもっと進んだものをプレイしてみましょう。アイデアは、2つの隣接する画像間でクロストランジション効果を作成する方法です。これは効果です:

デモンストレーションのために3枚の写真を撮ります。4つのステップでそれを作ります。

ステップ1:画像素材を3秒の長さの小さなビデオファイルに変換します。実行される3つのコマンドは次のとおりです。

ffmpeg -f image2 -framerate 0.33333 -i D:\ MTest \ IMG01.jpg -s 720x480 -r 15 -y D:\ MTest \ Vid1.mp4

ffmpeg -f image2 -framerate 0.33333 -i D:\ MTest \ IMG02.jpg -s 720x480 -r 15 -y D:\ MTest \ Vid2.mp4

ffmpeg -f image2 -framerate 0.33333 -i D:\ MTest \ IMG03.jpg -s 720x480 -r 15 -y D:\ MTest \ Vid3.mp4

少し説明:入力ソースとして単一の画像のフレームレートが0.33333であるのはなぜですか?3秒のビデオに変換したいので、1を3で割って0.33333を取得します。フレームレートの概念から理解すると、0.33333枚の画像が毎秒出力されると言われていますが、これは実用的な意味はありません。入力ソースの持続時間を制御する権利です。最終的に生成されたMP4ビデオファイルはすべて720x480に均一にスケーリングされ、フレームレートは15fpsです。

ステップ2:最終的なビデオファイルの長さを計算し、最初の画像を含む小さなビデオファイルを同じ長さに処理します。なぜそのようなステップがあるのですか?エフェクトを重ね合わせた後、上記の小さなビデオファイルを順番に接続するだけでは不十分ですか?試してみることができます...計算:3 3秒のビデオファイルが9秒になるように接続され、2つの隣接するビデオのオーバーラップを差し引くと、最終的なビデオの長さは7秒になります。Vid1.mp4を7秒に拡張する必要があります。最初の3秒は画像素材のコンテンツであり、最後の4秒は白で塗りつぶされています。次のようになります。

上記の処理を2つのステップで完了する必要があります。最初に4秒の真っ白なビデオファイルを生成します。

ffmpeg -t 4 -f lavfi -i color = c = white:s = 720x480:r = 15 -y D:\ MTest \ pure_white.mp4

次に、それをVid1.mp4に接続して、必要な7秒のVid0_1.mp4ファイルを生成します。

ffmpeg -i D:\ MTest \ Vid1.mp4 -i D:\ MTest \ pure_white.mp4 -filter_complex "concat = n = 2:v = 1:a = 0" -y D:\ MTest \ Vid0_1.mp4

ステップ3:最初と2番目のビデオを重ね合わせて接続します。最初のビデオの最後の1秒にフェードアウト効果を追加し、2番目のビデオの最初の1秒にフェードイン効果を追加する必要があります。2つの部分はオーバーレイフィルターによって重ね合わされます。少し複雑なので、複雑なフィルターfilter_complexが使用されます。コマンドラインは次のとおりです。

ffmpeg -i D:\ MTest \ Vid0_1.mp4 -i D:\ MTest \ Vid2.mp4 -filter_complex [0:v] fede = t = out:st = 2:d = 1 [v0]; [1:v] colorkey =#00FFFFFF:0.01:1 、fade = t = in:st = 2:d = 1 [v1]; [v0] [v1] overlay = x = ' if(gte(t、2)、0、NAN)':y = 0 -y D:\ MTest \ Vid1_2.mp4

タイムラインを描き、詳細に説明します。最初のビデオストリーム([0:v]で参照)では、フェードアウト効果が2秒目から追加され、継続時間は1秒です。このストリームの出力は次のように定義されます。新しいラベル[v0]。2番目のビデオストリーム([1:v]で参照)では、フェードイン効果が2番目の秒から追加され、継続時間は1秒です。このストリームの出力は新しいラベル[v1]として定義されます。最後に、2つのストリーム[v0]と[v1]をオーバーレイして、Vid1_2.mp4ファイルを生成します。

小さな質問があります:なぜ2番目のビデオにカラーキーフィルターを追加するのですか?(カラーキーの使用法については、前の記事を参照してください。)このフィルターを削除して、効果を確認することをお勧めします。カラーキーがない場合、2番目のビデオは2〜3秒の間に最初のビデオに完全にオーバーレイされます。つまり、最初のビデオの最後の1秒は透けて見えません。別の質問があります。2番目のビデオを制御して2番目の秒からオーバーレイを開始するにはどうすればよいですか。重要なのは、オーバーレイの開始座標点(x、y)を確認することです。使用される非常に高度な式は次のとおりです。if(gte(t、2)、0、NAN)-最初にgte(t、2)を見てください。つまり、時点が2以上の場合は、1を返し、それ以外の場合はを返します。 0。(x、y、z)の場合は外層を見てください。つまり、xの値が0でない場合は、yを返し、そうでない場合はzを返します。全体として、[0,2)の間隔です。オーバーレイの開始座標は(NAN、0)であり、これは無効な値であるため、重ね合わせは実行されません。tが2以上の場合、2番目のビデオオーバーレイは、画面の左上隅の原点(0,0)から始まります。

ステップ4:前のステップで生成されたビデオに基づいて、3番目のビデオを重ね合わせます。この方法は、3番目のビデオがオーバーレイを開始する時点が4秒であることを除いて、3番目のステップと同様です。コマンドラインは次のとおりです。

ffmpeg -i D:\ MTest \ Vid1_2.mp4 -i D:\ MTest \ Vid3.mp4 -filter_complex [0:v] fede = t = out:st = 4 :d = 1 [v0]; [1:v] colorkey =#00FFFFFF:0.01:1、fade = t = in:st = 0:d = 1 [v1]; [v0] [v1] overlay = x = 'if(gte(t、4)、0、NAN) ':y = 0 -y D:\ MTest \ Vid1_2_3.mp4

完了しました。効果を見てみましょう。

以前の基本的な方法-9秒
今日の高度な方法-7秒

 

おすすめ

転載: blog.csdn.net/happydeer/article/details/109273152