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で、実際にその速度で再生されるビデオを作成するにはどうすればよいのでしょうか。出力形式はそうではありません。」それは私にとって重要です。
コメント
回答
1秒あたり1フレームで再生されるビデオを生成するFFMPEGのワンライナーが必要な場合は、次のように入力と出力の両方にフレームレートを指定します。
ffmpeg -r 1 -i data / input-%4d.png -pix_fmt yuv420p -r 10 data / output.mp4
-r 1
は、ビデオが1秒あたり元の画像の1つで再生されることを意味します。
div id = “49294f6d5c”>
は、ビデオが1秒あたり10フレームで再生されることを意味します。
(-pix_fmt yuv420p
は、さまざまな再生プログラムとの互換性を確保するためのものです。ここでは、たとえば、ビデオをWindows Media Playerで再生できるようにする必要があります。)
さまざまな出力フレームレートをテストしましたが、使用できる最小の数値は10であり、それでもVLCが再生するビデオ。
もちろん、上記のコマンドは、元の各画像が乗算されることを意味しますが、これは、前述の「スローダウン」よりも簡単な方法であり、コーデックによって異なります。真の1-FPSビデオよりもはるかに大きなビデオを生成しない場合があります。
これをテストするために、2.24kiBの真の1-FPSビデオを生成しました。次に、同じ入力画像で24 FPSで出力するビデオを作成したところ、5.76kiBになりました。これはサイズの2倍強で、サイズの24倍にはほど遠いです。:)
コメント
- +1 on-pix_fmt。簡単に一部の人々がWMPの使用を主張することを忘れてください:-)
- 入力が1だけであるのに出力フォーマットを10fpsにしたいのはなぜですか?'まったく同じ90%の冗長フレームを作成しますか?
- @Herbert冗長フレームを作成して、最大10のフレームレートを取得できるようにします。これは VLCが実行しないように'文句を言わない、そして視覚的にビデオを変更しない'エンコーダーはフレームがすべて同一であることを確認するのに十分スマートなので、 'ファイルがはるかに大きくなることはありません
- @chiliNUTクリア、キーフレームのことです。すべての形式ではありませんが、ほとんどの正常な形式で問題ありません。ありがとうございます。 !
回答
両方を使用-framerate
および-r
たとえば、1FPSのような最終的なビデオを作成するには:
ffmpeg -framerate 1 -pattern_type glob -i "*.png" \ -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4
これは、 PNGフレームを1FPSでビデオに変換するものと似ています| Unix & Linux Stack Exchange によると、-r
divの代わりに-framerate
が必要でした>それが機能するために。
これは、wikiの http://trac.ffmpeg.org/wiki/Slideshow#Framerates <に記載されています。 / p>
VLCが処理できる30
に出力フレームレートを設定し、各画像を30回コピーして、出力ビデオが1FPSで表示されるようにします。参照: ffmpegを使用した画像からの低fpsビデオでのVLCでの再生の問題|スタックオーバーフロー
VLCはビデオを正常に再生できます。
Ubuntu 16.10、VLC 2.2.4、ffmpeg
3.0.5、10個のPNGがあるディレクトリ。
コメント
- 'と
-r
と-framerate
? - @Royi私にはわからない'それが私のために働いた唯一のものであることを除いて:-)しかし、あなたが
man
ページから抽出し、お知らせください;-)意味のある引用は" -r入力オプションとして、無視してくださいファイルに保存されているタイムスタンプは、一定のフレームレートfpsを想定してタイムスタンプを生成します。これは、image2やv4l2などの一部の入力形式で使用される-framerateオプションと同じではありません(以前のバージョンのFFmpegでは同じでした)。疑わしい場合は、入力オプション-rの代わりに-framerateを使用してください。"
回答
2番目の例を次のように少し拡張するとどうなりますか:
$ ffmpeg -r 1 -i data/input-%4d.png -c:v libx264 out.mp4
-r 1
.pngファイルの後ではなく、前に配置する必要があります。
原則として、オプションは次に指定されたファイルに適用されます。したがって、順序は重要であり、コマンドラインで同じオプションを複数回使用できます。次に、各オカレンスが次の入力ファイルまたは出力ファイルに適用されます。
コメント
- 残念ながらこれ動作しません。ただし、順序が重要であると言及することで、多くの時間を節約できました。ありがとう。
回答
これはVLCのバグです(バージョン3.0.6にはまだ存在します)。いくつかの実験の結果、FPSが10 未満の動画で VLCがクラッシュすることに気付きました。したがって、10 FPS以上のすべての動画は問題になりません。したがって、現在、VLCで再生可能な1 FPSの動画を取得するクリーンな方法はありません(諦め、読み続けてください)。
1つの回避策は、上記の回答に示されているように、画像を複製して1FPSの効果を偽造することです(実際には、FPSが10以上であり、VLCでも問題ありません。
例: 12個の画像を含むフォルダーがあり、1 FPS(VLCで再生可能)のビデオを生成する場合は、各画像を複数回(たとえば、10回)複製してから、次のように指示する必要があります。 FFMPEGを使用して10FPSビデオを生成します。このようにして、合計フレーム数が120のビデオが取得され、各画像が1秒間再生されます(10回複製されるため)。これは、1FPSの偽物です。
ではなくfps
パラメータを使用する方が好きですd = “592a2f43d6″>
(別の回答に示されています)これは、場合によっては問題になる可能性があります(公式ドキュメント)。
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
は重要ですこの構成は次に説明するビデオ(入力または出力)に適用されるためです。これは、公式ドキュメントによるものです:
オプションは次に指定されたものに適用されますファイル。したがって、順序は重要です…
ffmpeg
は、コンテナ形式のファイル拡張子.mp4
からビデオコーデックを理解するのに十分なほど賢いです。-vcodec libx264 -vpre hq
をコマンドラインに追加して、コーデックとエンコーディングパラメータを伝えてみてください。-r 1
を追加したときにのみ奇妙な結果が生成されました。