1FPSでPNGフレームをビデオに変換

1FPSでPNGフレームをビデオに変換

1FPSのPNG形式のビデオフレームがあり、ffmpegを使用してビデオに変換しようとしています。

私が次のようにした場合:

ffmpeg -i data/input-%4d.png data/output.mp4

デフォルトでは、入力をすばやく巻く(1FPSでキャプチャされた)25FPSビデオが得られました。

私が試した場合:

ffmpeg -i data/input-%4d.png -r 1 data/output.mp4

VLCが再生したくないものを得ました:)

最初のビデオ(FFビデオ)を撮影してフィルタを適用して速度を遅くすると(たとえば-filter:v 'setpts=24.0*PTS')、1FPSビデオのように再生することができますが、もちろんファイルサイズは犠牲になります。私はそれが多くの冗長フレームを生成すると思います。

もしそうなら、問題は1FPSでビデオを作成し、実際にその速度で再生できることです。しかし、出力形式は私にとってそれほど重要ではありません。

答え1

FFMPEGの単一ラインが毎秒1フレームで再生されるビデオを生成するには、次のように入力および出力フレームレートを指定する必要があります。

ffmpeg -r 1 -i データ/input-%4d.png -pix_fmt yuv420p -r 10 データ/output.mp4

これは-r 1、ビデオが1時に再生されることを意味します。オリジナル画像毎秒。
これは、-r 10ビデオが毎秒10フレームで再生されることを意味します。

-pix_fmt yuv420pさまざまな再生プログラムとの互換性を確保するためにのみ使用されます。たとえば、Windows Media Playerを介してビデオを再生するにはここで必要です。)

さまざまな出力フレームレートをテストしましたが、10がVLCで再生できるビデオを生成するために使用できる最も低い数字のようです。

もちろん、上記のコマンドはそれぞれの元の画像を乗算することを意味しますが、これはあなたが言った「遅くする」よりも簡単なアプローチであり、コーデックによってははるかに大きな実際の1-FPSよりも良いものを生成できないかもしれません。動画。

これをテストするために、サイズ2.24kiBの実際の1FPSビデオを作成しました。その後、同じ入力画像でビデオを作成しましたが、出力は24FPSで5.76kiBになりました。 24番よりはるかに少ない2番が少し以上です。 :)

答え2

-framerateそして-r

たとえば、1FPSのように見える最終ビデオを取得するには:

ffmpeg -framerate 1 -pattern_type glob -i '*.png' \
    -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

これは次のようになります。UnixとLinuxのスタック交換でPNGフレームをビデオに変換するしかし、動作させる-framerate代わりに必要です。-r

Wikipediaでは、次のように言及しています。http://trac.ffmpeg.org/wiki/Slideshow#Framerates

出力フレームレートを30VLCが処理できるレベルに設定し、各画像を30回コピーして出力ビデオが1FPSのように見えるようにします。また見なさい:ffmpegを使用した画像の低fpsビデオのVLC再生問題の処理

これにより、VLCはビデオを正常に再生できます。

ffmpeg10個のPNGを含むディレクトリでUbuntu 16.10、VLC 2.2.4、3.0.5でテストされました。

また見なさい:https://stackoverflow.com/questions/19267443/vlc-freezes-for-low-1-fps-video-created-from-images-with-ffmpeg

答え3

2番目の例を次のように少し拡張すると:

$ ffmpeg -r 1 -i data/input-%4d.png -c:v libx264 out.mp4

-r 1.pngファイルの後ろではなく前になければなりません。

~からFFmpegドキュメント:

通常、オプションは指定された次のファイルに適用されます。したがって、順序が重要であり、コマンドラインで同じオプションを複数回使用できます。その後、各発生は次の入力ファイルまたは出力ファイルに適用されます。

答え4

これはVLCのバグです(バージョン3.0.6にもまだ存在します)。数回の実験の終わりに私は気づいた。FPSが10未満のビデオでVLCがクラッシュする。したがって、10FPS以上のすべての動画は問題になりません。したがって、現在VLCで再生可能な1FPSビデオを取得するための確実な方法はありません(あきらめないで読んでください。)。

1つの回避策は、上記の回答に示すように、イメージを複製して1FPSの効果を偽にすることです(実際のFPSが10以上の場合はVLCでは問題ありません)。

例:12の画像を含むフォルダがあり、1FPSビデオ(VLCで再生可能)を作成するには、各画像を複数回(たとえば10回)コピーしてからFFMPEGに10FPSビデオを生成するように指示する必要があります。 。これにより、合計120フレームのビデオが提供され、各画像は1秒間再生されます(10回繰り返されるため)。これは単に1FPSの幻想です。

私は好むfps代わりにパラメータを使用してください。-r(他の回答に表示されます)場合によっては、問題が発生する可能性があります。公式文書)。

ffmpeg -framerate 1 -i "img (%d).jpg" -c:v libvpx-vp9 -vf "fps=10,format=yuv420p" out.mkv

入力が-framerate出力より低いため、fpsFFMPEGは目的の出力フレームレート(上記のコマンドに従って10)を達成するためにフレームをコピーします。

道路注意することが重要ですそれ-framerateと順序が-vf fps重要です。これは、次のビデオ(入力または出力)に適用されるためです。つまり、公式文書:

オプションは、次に指定されたファイルに適用されます。だから順序が重要です...

関連情報