科学的な目的で、ビデオの「10フレームごとに正確に1フレーム」のフレームを抽出しようとしています(つまり、1を抽出し、9のままにしてから繰り返します)。ビデオは105フレーム、3.5秒、29.97fps(h.264、.mov、Nikon D3100により作成)です。
ここにアップロード があります。
以下のコマンドは10フレームを生成しますが、6つの画像しか生成しません。さまざまなシーン比率を試してみましたが、どちらも正しい数のフレームを生成しませんでした。
vlc 1.mov --video-filter=scene --vout=dummy --scene-ratio=10 --scene-prefix=img- --scene-path=. vlc://quit
誰かが私に何が問題なのか教えてくれませんか?
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
どうすれば自分のやりたいことを達成できますか?
これを行うには、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.jpg
、img_002.jpg
、img_003.jpg
などが出力されます。
あなたの質問で最も重要な点は、ビデオが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 '{}' \;
mencoder
を使用できる場合、framestep
オプションを試すことができます。説明は ドキュメント内 で、framestep=10
のようにあなたの場合。個人的にはインストール/試行できませんでした。
最初にビデオを一連の未加工のrgb24またはrgb32画像に変換する場合、元の形式ではまったく画像ではない可能性のある異常なフレームタイプが含まれている可能性があるため、適切な数のフレームを取得できる可能性があります。 ?
オリジナルのレーザーディスクでは、ビデオ全体が1〜100,000以上の個別のフレーム番号を持つ一連の画像で構成されていました。これは、将来の変換や操作のベースラインを確立するための正しい方法です。
業界はこの奇妙な圧縮のアイデアに変更して、費やされた金額を減らし、処理する数値の真の科学的形態を壊しました。
オーディオを完全に失わないように、最初にオーディオをウェーブファイルとして抽出する必要があります。 FFMPEGは、抽出された各画像に識別情報を配置するようです。抽出されたばかりの画像から文字列画像をまとめようとし、同じ拡張子を持つ他のソースからの他の画像を混在させると、ffmpegは、すべての真ん中につながろうとした画像を無視します。
レーザーディスク形式では、フレームレートは、シーケンシャルイメージを提示するレートによって決まり、イメージ自体によって制御されることはありません。
FFMPEGは、あらゆる種類の画像の適切な処理と表示のために、芸術ではなく科学から教訓を得るかもしれません。あるいは、AV業界全体かもしれません。業界では、ハードウェアの機能を改善し、大量のメモリ/ストレージを必要とする生データを使用する必要があります。精度と正確さのために生データに勝るものはありません。