2016-07-07 17 views
2

ビデオでffmpegを使用して、フレーム番号で示される特定のフレームのリストを抽出しようとしています。したがって、正確にはフレーム番号150の 'test_video.mp4'から1つのフレームだけを抽出したいとします。私はフレームのリストを強要したい場合、私は[100, 110, 127, 270, 300]として、このように次のコマンドffmpegを使用して特定のフレームのリストを抽出します

ffmpeg -i test_video.mp4 -vf "select=gte(n\, 150)" -vframes 1 ~/test_image.jpg

しかし、何を使用することができますか?私はこのページ(https://ffmpeg.org/ffmpeg-filters.html#select_002c-aselect)を見ていて、フレーム番号、タイムスタンプなどのパリティに基づいて複数のフレームを抽出する方法があることがわかりましたが、私は何をする必要があるかの構文を見つけることができません。

理想的には、%03dが与えられたフレーム番号に置き換えられた名前付け規則out_image%03d.jpgの下で、指定されたフレームのリストを抽出するのが理想的ですが、タイムスタンプも機能します。

これを行う方法はありますか?

+1

私は以下のような構文を使ってたくさんの組み合わせを試しました: 'ffmpeg -i Hamlet.mp4 -vf 'select = eq(1000 \、n)+ eq(150 \、n)' -f image2 out_image%03d。 jpg' - しかしこれは私が期待したことをしなかった。それはフレーム150から始まり、次のフレーム151を与えました(この後に続きます)...この場合の選択は固まってしまい、ストリームから放たれているようです...私はそれをもう少し再生します。 –

答えて

6

使用

ffmpeg -i in.mp4 -vf select='eq(n\,100)+eq(n\,184)+eq(n\,213)' -vsync 0 frames%d.jpg 

FFmpegのは、主に、時限ビデオすなわちメディアのプロセッサであり、フレームレートやサンプルレートなどのサイクルレートで実行されます。出力はソースと同じレートでなければならないと仮定します。不十分なフレームが供給された場合、そうでないと言わない限り複製されます。 -vsync 0が追加されています。この場合、重複を抑制するよう指示されます。

+0

ありがとうございます、必要なだけ正確に動作します。 –

1

非常にナイーブな答え...

#! /bin/sh -e 
# framegrab v0.1 

frames="$1" 
filename="$2" 
printf '%s' "$frames" | 
sed 's:\[\|\]::g; s:[, ]\+:\n:g' | 
xargs printf '%03d\n' | 
xargs -IFRAME ffmpeg -i "$filename" -vf "select=eq(n\,FRAME)" -vframes 1 out_imageFRAME.jpg 

は、あなたの引数リストでそれを呼び出します。

framegrab '[100, 110, 127, 270, 300]' test_video.mp4 
+0

ご協力いただきありがとうございます!私は自分自身で考え出すのが苦労していますが、これはフレーム番号ごとに1つのffmpegプロセスを実行するのでしょうか、または単一のffmpeg呼び出しですべての希望するフレームを取得していますか? –

+0

私はこれを動作させることができませんでしたが、5つのフレーム番号のリストが与えられても、単一の画像ファイルしか出力しません。 –

+0

だから私は 'sed ':\ [:: g; s:\] :: g; s /、*/\ n/g '| '〜' sed':\ [:: g; s:\] :: g; s /、*// g '| 'のようになりましたが、ffmpegを何度も何度も実行していることがわかりました。これは技術的には機能しますが、私が実行している組み込みシステムには理想的ではありません。私はffmpegでそれを処理する方法があると期待していました –

関連する問題