生のビデオを取り、奇数フレームまたは偶数フレームのみを含む新しいビデオを(選択により)抽出する正確な方法はありますか?
例えば:
400フレーム(0-399)の "blah.yuv"があります。フレーム1-399(1,3,5,7 ... 399)を含む「blahOdd.yuv」と、フレーム0-398(0,2,4,6 ... 398)を含む「blahEven」を作成したい)。
FFmpegのみを使用してそれを行う方法のアイデアはありますか?
正確に機能させるには、まずビデオをRAW YUVビットストリームに変換します(まだ変換されていない場合)。
ffmpeg -i input.mp4 -an -vcodec rawvideo -pix_fmt yuv420p rawbitstream.yuv
次のステップ: select
filter は an 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 …
FfmpegがAviSynthフラグを使用してビルドされている場合、 私は信じています _.avs
_ファイルを渡すことができます。
ffmpeg
を実行し、configurationデータで_--enable-avisynth
_を探すことで確認できます。
そこにある場合は、_ffmpeg -i blahEven.avs blahEven.yuv
_のように使用できます。
ここで、_blahEven.avs
_は単純です。
ffvideosource( "blah.yuv")。SelectEven()
奇数フレームの場合、SelectOdd()
を使用します。
より進んだ使い方については、 SelectEvery のドキュメントを参照してください。