web-dev-qa-db-ja.com

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

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

私がこのようなことをした場合:

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

25FPSでビデオを取得します。これは基本的に入力の非常に早送りです(1FPSでキャプチャされます)。

私が試した場合:

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

VLCがプレイしたくないものを手に入れました:)

ここで、最初のビデオ(FFビデオ)を取り、フィルターを適用して速度を下げます(例:-filter:v 'setpts=24.0*PTS')、1 FPSビデオのように再生できますが、価格はファイルサイズです。それは私が推測する繰り返しフレームの束を生成しています。

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

21
Assaf Lavie

1フレーム/秒で再生するビデオを生成するFFMPEGのワンライナーが必要な場合は、次のように、入力と出力の両方にフレームレートを指定します。

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

-r 1は、ビデオが1秒あたり元の画像の1つで再生されることを意味します。
-r 10は、ビデオが毎秒10フレームで再生されることを意味します。

-pix_fmt yuv420pは、幅広い再生プログラムとの互換性を確保するために存在します。たとえば、Windows Media Playerでビデオを再生できるようにするために必要です。)

私は多くの異なる出力フレームレートをテストしましたが、VLCが再生するビデオを生成するために使用できる最低数は10です。

もちろん、上記のコマンドは元の各画像が乗算されることを意味しますが、これはあなたが言った「スローダウン」よりも簡単な方法であり、コーデックによっては、実際の1-FPSよりもはるかに大きなビデオを生成しない場合がありますビデオ。

これをテストするために、本当の1-FPSビデオを作成したところ、2.24 kiBになりました。次に、同じ入力画像を使用して24 FPSで出力するビデオを作成したところ、5.76 kiBになりました。それはサイズのちょうど2倍を超えており、サイズの24倍にはほど遠いものです。 :)

19
A.M.

-framerate-rの両方を使用

たとえば、1FPSのような最終的なビデオを作成するには:

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

これは PNGフレームを1 FPSでビデオに変換する| Unix&Linux Stack Exchange と似ていますが、機能させるには-framerateではなく-rが必要でした。

これはwikiの http://trac.ffmpeg.org/wiki/Slideshow#Framerates で言及されています

VLCが処理できる30に出力フレームレートを設定し、各画像を30回コピーして、出力ビデオが1 FPSに見えるようにします。参照: ffmpegを使用した画像からの低fpsビデオでのVLCの再生の問題|スタックオーバーフロー

その後、VLCはビデオを正常に再生できます。

Ubuntu 16.10、VLC 2.2.4、ffmpeg 3.0.5で、10個のPNGを含むディレクトリでテストされています。

参照: https://stackoverflow.com/questions/19267443/vlc-freezes-for-low-1-fps-video-created-from-images-with-ffmpeg

次のように2番目の例を少し拡張するとどうなるでしょうか。

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

-r 1は、.pngファイルの前ではなく、前に来る必要があります。

FFmpegドキュメント から:

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

3
slm

これはVLCのバグです(バージョン3.0.6にも存在します)。いくつかの実験の後、FPSが10未満のビデオでVLCがクラッシュすることに気付きました。したがって、10 FPS以上のすべてのビデオが問題になることはありません。そのため、現在、VLCで再生可能な1 FPSのビデオを取得するためのクリーンな方法はありません(あきらめず、読み続けて)。

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

例:12画像のフォルダーがあり、1 FPSのビデオを生成したい場合(VLCで再生可能)、各画像を複数回複製する必要があります(10回としましょう) )、次にFFMPEGに10 FPSビデオを生成するように指示します。このようにして、合計120フレームのビデオを取得します。各画像は1秒間(10回複製されるため)再生されますが、これは単に1 FPSの偽物です。

-rよりもfpsパラメータを使用することを好みます(これは別の回答に示されています)場合によっては問題になる可能性があります( 公式ドキュメントによると ) 。

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

入力-framerateは出力fpsよりも低いため、FFMPEGはフレームを複製して目的の出力フレームレート(上記のコマンドでは10)に到達します。

に注意することも重要ですこの-framerate-vf fpsの順序は重要ですこの構成は次に言及するビデオに適用されるため(-または出力)。それは 公式ドキュメント によると:

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

0