web-dev-qa-db-ja.com

FFmpegを使用してすべての偶数または奇数のフレームをドロップしますか?

生のビデオを取り、奇数フレームまたは偶数フレームのみを含む新しいビデオを(選択により)抽出する正確な方法はありますか?

例えば:

400フレーム(0-399)の "blah.yuv"があります。フレーム1-399(1,3,5,7 ... 399)を含む「blahOdd.yuv」と、フレーム0-398(0,2,4,6 ... 398)を含む「blahEven」を作成したい)。

FFmpegのみを使用してそれを行う方法のアイデアはありますか?

14
Mark

正確に機能させるには、まずビデオをRAW YUVビットストリームに変換します(まだ変換されていない場合)。

ffmpeg -i input.mp4 -an -vcodec rawvideo -pix_fmt yuv420p rawbitstream.yuv

次のステップ: select filteran expression を取ります。ここで、nはフレーム番号です。

ffmpeg -r 2 -s WxH -i rawbitstream.yuv -filter:v select="mod(n-1\,2)" \
-c:v rawvideo -r 1 -format rawvideo -pix_fmt yuv420p -an odd.yuv

ffmpeg -r 2 -s WxH -i rawbitstream.yuv -filter:v select="not(mod(n-1\,2))" \
-c:v rawvideo -r 1 -format rawvideo -pix_fmt yuv420p -an even.yuv

重複しないフレームをffmpegにするには、入力のフレームレートの半分を強制する必要があります。そのため、入力として「2」、出力として「1」を設定します。生のビットストリームにはこの情報を伝えるヘッダーがないため、WxHをクリップの実際のサイズに置き換えることを忘れないでください。

上記の代わりに、出力に新しいタイムスタンプを設定する setpts フィルターを追加することもできます。ただし、フレームが正確にドロップされないので注意してください。ここで、25は実際に必要な出力フレームレートです。

ffmpeg -i input.mp4 -filter:v select="mod(n-1\,2)",setpts="N/(25*TB)" \
-c:v rawvideo -r 12.5 -format rawvideo -pix_fmt yuv420p -an odd.yuv

ffmpeg -i input.mp4 -filter:v select="not(mod(n-1\,2))",setpts="N/(25*TB)" \
-c:v rawvideo -r 12.5 -format rawvideo -pix_fmt yuv420p -an even.yuv

もちろん、別のピクセル形式(ffmpeg -pix_fmts)。ファイルを読み取るときに、ピクセルサイズとピクセル形式がわかっていることを確認してください。

ffmpeg -f rawvideo -s:v 1280x720 -pix_fmt yuv420p input.yuv …
11
slhck

FfmpegがAviSynthフラグを使用してビルドされている場合、 私は信じています _.avs_ファイルを渡すことができます。

ffmpegを実行し、configurationデータで_--enable-avisynth_を探すことで確認できます。 --enable-avisynth

そこにある場合は、_ffmpeg -i blahEven.avs blahEven.yuv_のように使用できます。

ここで、_blahEven.avs_は単純です。

ffvideosource( "blah.yuv")。SelectEven()

奇数フレームの場合、SelectOdd()を使用します。

より進んだ使い方については、 SelectEvery のドキュメントを参照してください。

3
Louis Waweru