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


21

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は、私にとってそれほど重要ではありません。


ffmpegコンテナ形式のファイル拡張子だけでビデオコーデックを把握できるほど賢いのかどうかはわかりません.mp4-vcodec libx264 -vpre hqコマンドラインに追加して、コーデックとエンコードパラメータを通知してください。
ウォーレンヤング

それは実際にそれをうまく理解し、言及したように私はそれがうまく機能し、を追加し-r 1たときに奇妙な結果しか出なかった。
アサフラヴィー

stackoverflow.comまたはsuperuser.comで ffmpegの答えを見つけた方が幸運かもしれません。
ダミアン

回答:


19

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

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

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

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

多くの異なる出力フレームレートをテストしましたが、VLCで再生されるビデオを生成するのに使用できる最小の数値は10であるようです。

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

これをテストするために、2.24 kiBになった真の1-FPSビデオを作成しました。次に、同じ入力画像を使用して24 FPSで出力するビデオを作成し、5.76 kiBで出力しました。これはサイズの2倍強であり、サイズの24倍近くはありません。:)


-pix_fmtで+1。一部の人々がWMPの使用を主張していることを忘れがちです:-)
Smalltown2k

入力が1だけであるのに、なぜ出力フォーマットを10 fpsにしたいのですか?まったく同じ90%の冗長フレームを作成しませんか?
ハーバート

@Herbertは冗長フレームを作成するため、最大10のフレームレートを得ることができます。これは、VLCが文句を言わないように、また視覚的にビデオを変更しないように行われます。エンコーダーは、フレームがすべて同一であることを確認するのに十分なほど賢いので、はるかに大きなファイルにはなりません
chiliNUT

@chiliNUTは、すべての形式ではありませんが、ほとんどの正気な形式でできるキーフレームです。ありがとう!
ハーバート

5

両方-framerateを使用-r

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

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

これは、1 FPSでPNGフレームをビデオに変換するものに似ていますUnix&Linux Stack Exchangeは言いますが、-framerate代わりに動作-rする必要がありました。

これは、Wikiのhttp://trac.ffmpeg.org/wiki/Slideshow#Frameratesに記載されています。

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

これで、VLCはビデオを通常どおり再生できます。

Ubuntu 16.10、VLC ffmpeg2.2.4、3.0.5、PNG 10個のディレクトリでテスト済み。

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


違いは何だ-rとは-framerate
Royi

@Royi私は本当にそれが私のために働いた唯一のものであることを除いて本当に知りません:-)しかし、あなたがmanページからそれを抽出することができたなら、私に知らせてください;-)意味のある引用は "-r As a入力オプション、ファイルに保存されているタイムスタンプを無視し、代わりに一定のフレームレートfpsを想定してタイムスタンプを生成します。これは、image2やv4l2などの一部の入力形式に使用される-framerateオプションとは異なります。 FFmpeg)。疑わしい場合は、入力オプション-rの代わりに-framerateを使用してください。
Ciro Santilli新疆改造中心法轮功六四事件

3

次のように2番目の例を少し増やした場合:

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

-r 1ニーズがない後、.PNGファイルの前に来ています。

FFmpegドキュメントから:

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


残念ながら、これは機能しません。ただし、順序が重要であることに言及することで、多くの時間を節約できました。ありがとう。
モハメッドヌールディン

0

これは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の偽物です。

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

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重要であり、この構成は次上記ビデオ(IN-または出力)に適用されるように、。公式ドキュメントによると:

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

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