VLCまたはFFmpegを使用してビデオの「10フレームごとに1つ」を抽出する


12

科学的な目的で、ビデオの「10ごとに正確に1フレーム」のフレームを抽出しようとしています(つまり、1を抽出し、9のままにしてから繰り返します)。ビデオは105フレーム、3.5秒、29.97fps(h.264、.mov、Nikon D3100により作成)です。

私がいるここでそれをアップロード

VLC

以下のコマンドは10フレームを生成するはずですが、6つの画像しか生成しません。さまざまなシーン比率を試してみましたが、どちらも正しい数のフレームを生成しませんでした。

vlc 1.mov --video-filter=scene --vout=dummy --scene-ratio=10 --scene-prefix=img- --scene-path=. vlc://quit

誰かが私に何が問題なのか教えてくれませんか?

FFmpeg

FFmpegには、私の目的にぴったり合ったコマンドがないようです。以下のコマンドは、毎秒3フレームを抽出しますが、FPSは正確に30ではなく(2.97)、正確な結果を生成しません。

さらに、FFmpegでも、このコマンドを使用しても正しいフレーム数が得られません。3.5秒のビデオで最大10フレームを期待していますが、得られるのは12フレームです。

ffmpeg -i 1.mov -y -an -sameq  -r 3 -f image2 -vcodec mjpeg %03d.jpg 

どうすれば自分のやりたいことを達成できますか?


1
BTW -sameqは、あなたがおそらく思っていることを実行せず、現在のバージョンから削除されました(実際のffmpeg、つまり、Ubuntuの偽のffmpegにあるかどうかはわかりません)。代わりにqscaleを使用してください。
stib 2014

回答:


21

10フレームごとに1フレームを選択

これを行うには、selectビデオフィルターを使用できますffmpeg

ffmpeg -i input.mov -vf "select=not(mod(n\,10))" -vsync vfr -q:v 2 img_%03d.jpg
  • JPG出力の場合、で品質を変えることができます-q:v。有効範囲は2(最高品質)から31(最低品質)です。代わりにPNGに出力する場合は、このオプションは必要ありません。

  • この意志出力img_001.jpgimg_002.jpgimg_003.jpg、など


非常に興味深いように見えますが、特定のバージョンまたは追加のコンパイルが必要なようです。「unrecognized option '-filter:v'」と「FFmpegバージョンSVN-r0.5.1-4:0.5.1-1ubuntu1.3」(-enable-avfilter --enable-avfilter-lavf --enable-vdpau --enable-bzlib --enable -libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --disable-stripping --disable-vhook --enable-runtime-cpudetect- -enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --enable-shared --disable-static)
mivk

また、コマンドを実行できず、ffmpegウィンドウN-35709-g7d531e8で次のエラーを受け取ります:[select @ 017EBB00] [Eval @ 0022DC08] Missing ')' or too many args in 'mod(n \、10))' [ select @ 017EBB00]式 'not(mod(n \、10))'の解析中にエラーが発生しました引数 'not(mod(n \、10))'でフィルター 'select'を初期化中にエラーが発生しましたフィルターを開くときにエラーが発生しました!
WMAC

@mivk UbuntuリポジトリのFFmpegバージョンにはフィルタリング機能がありません。FFmpegコンパイルする必要があります
llogan

1
@wmac Windowsは一重引用符が嫌いだと思います。それらを二重引用符に変更します"
llogan 2012

1
@LordNeckbeard、ありがとうございます。正しく実行され、問題全体が解決されました。本当にありがとうございました。
wmac

4

あなたの質問で最も重要な点は、ビデオが30ではなく29.97フレーム/秒を使用するという事実です。厄介なNTSC。

とにかく、私はすべてのフレームを抽出しから、不要なものを削除するのが最も簡単だと思います:

ffmpeg -i 1.mov -y -f image2 -c:v mjpeg %03d.jpg

次に、不要なものを削除します。10フレームごとにで終わるので1.jpg、他のすべてを取得できます…

find . -maxdepth 1 -not -iname "*1.jpg"

…そして、これらが削除したいものであることを確認したら:

find . -maxdepth 1 -not -iname "*1.jpg" -exec rm '{}' \;

を使用できる場合は、あなたの場合と同様に、ドキュメントで説明されているようにmencoderframestepオプションを試すことができます。個人的にはインストール/試行できませんでした。framestep=10


1
あなたの助けと編集をありがとうございました。私はメンコーダーを試しましたが、それでも問題があります!コーデックかコンテナのどちらかと関係があると思います。ffmpegは、以下のコマンドで正確に105フレームを抽出します:ffmpeg -i 1.mov -y -an -sameq -f image2 -vcodec mjpeg%03d.jpgしかし、mencoderは90フレームしか抽出しません!!! 以下のコマンドを使用:mplayer -vo png 1.mov framestep = 10を使用すると、誤った数のフレームが生成されます。3つすべて(ffmpeg、vlc、およびmencoder)がこのような単純なタスクを正しく実行できないことに驚いています。バグレポートをVLC Webサイトに送信しました。再度、感謝します。
wmac

0

最初にビデオを一連のrgb24またはrgb32画像に変換した場合、元の形式ではまったく画像ではない可能性のある異常なフレームタイプが含まれている可能性があるため、適切な数のフレームを取得できる可能性があります。 ?

オリジナルのレーザーディスクでは、ビデオ全体が1〜100,000以上の個別のフレーム番号を持つ一連の画像で構成されていました。これは、将来の変換や操作のベースラインを確立するための正しい方法です。

業界は、この奇妙な圧縮のアイデアに変更して、費やされた金額を減らし、処理する数値の真の科学的形態を壊しました。

オーディオを完全に失わないように、最初にオーディオをWaveファイルとして抽出する必要があります。FFMPEGは抽出された各画像に識別情報を配置するようです。抽出されたばかりの画像から文字列画像を一緒にしようとし、同じ拡張子を持つ他のソースからの他の画像を混在させると、ffmpegはすべての真ん中につながろうとした画像を無視します。

レーザーディスク形式では、フレームレートは、シーケンシャルイメージを提示するレートによって決まり、イメージ自体によって制御されることはありません。

FFMPEGは、あらゆる種類の画像の適切な処理と表示のために、芸術ではなく科学から教訓を得るかもしれません。あるいは、AV業界全体。業界では、ハードウェアの機能を改善し、大量のメモリ/ストレージを必要とする生データを使用する必要があります。精度と正確さのために生データに勝るものはありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.