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


14

生のビデオを取得し、そこから奇数フレームまたは偶数フレームのみを含む新しいビデオを抽出する正確な方法はありますか?

例えば:

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

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

回答:


11

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

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

次のステップ:selectフィルター式を取ります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重複はないフレームを、あなたの入力のフレームレートの半分を強制する必要があります-あなたは出力に入力し、「1」と「2」を設定するようにします。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の新しいバージョンでは、-filter:vではなく-vfにする必要があります。さらに、nカウントは1から始まり、フレームカウントは0から始まるように見えるため、mod(n-1 \、2)でなければなりません(そうでない場合、最初のフレームが3回複製されます)。しかし、まだ問題があります。フレームを複製しますが、それらを削除したいのです。たとえば、最終的なクリップにはフレームの半分しか含まれません。
マーク

-vfはのエイリアスです-filter:v。今は確実にテストすることはできませんが、後でマシンに戻ったときにこれを調べます。たぶんtinterlaceフィルタは、同じことを行うことができますか?
slhck

「-r 2 -i blah.yuv -r 1」を試しましたが、「Option framerate not found
マーク

申し訳ありませんが、これは機能しません(もう?)、画像に対してのみです。
slhck

1
@AnmolSinghJaggiいいえ、これは単にフレームをドロップしますが、それほど確定的であるかどうかはわかりません(つまり、奇数フレームごとにドロップします)。タイムコードに基づいていますが、正確ではない場合があります。
slhck

2

ffmpegがAviSynthフラグを使用して構築されている場合、.avsファイルを渡すことができる思います。

実行して構成データffmpegを検索することで確認できます。 --enable-avisynth--enable-avisynth

そこにある場合は、次のように使用できますffmpeg -i blahEven.avs blahEven.yuv

blahEven.avs単純なところは:

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

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

より高度な使用法については、SelectEveryのドキュメントを参照してください。


これは優れた代替手段ですが、前述したように、ffmpegのみを使用するように制限されています。その理由は、.batファイルのみを作成する自動システムの一部であり、AVSを追加する可能性がないためです。
マーク

@Markもし--enable-avisynthあったら、それはAviSynthがffmpegに組み込まれていることを意味すると思っていましたが、それについてはわかりません。
ルイ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.