たとえば、1分の長さのmp3ファイルがあるとします。そして、私は20のPNG画像を持っています。これらの画像と音声をビデオファイルに結合したいが、各画像を画面上で3秒間持続させたくない、一部の画像を5秒間持続させたい、他の画像を1秒間持続させたいなど。
私が考えることができる唯一の方法は、もっと長く続くはずの画像を単にコピーすることです。 image1、image2、image3がまったく同じになるようにすると、ビデオの時間が3倍になります。
ただし、これは非常に時間とスペースを消費します。 ffmpegにそれを可能にするスイッチ/パラメーターはありますか?
Ffmpeg 2.0を使用するには、いくつかの方法があります。
1つの方法は、ファイルの変更時間を使用することです。まず、画像ファイルの 変更時間を設定 にして、各画像ファイルの変更時間を前の画像ファイルよりも長くします。時間差は前の画像の継続時間です(1秒の解像度)。次に、image2デマルチプレクサオプション -ts_from_file 1
を使用します。例えば:
touch -t 01010000.00 image01.png
touch -t 01010000.03 image02.png
touch -t 01010000.08 image03.png
...
ffmpeg -ts_from_file 1 -i image%2d.png -i audio.mp3 -c:a copy -vf fps=25 out.avi
別の方法は concat
demuxer を使用することです。これは、オプションの期間を指定して、連結するファイルのリストを取得します。まず、次のような画像と期間をリストしたファイルを作成します。
ffconcat version 1.0
file image01.png
duration 3
file image02.png
duration 5
file image03.png
次に、このファイルをffmpegへの入力として提供します。例えば:
ffmpeg -i in.ffconcat -i audio.mp3 -c:a copy -vf fps=25 out.avi
最後の期間の後、最後のファイルを複製する必要がある場合があります。 -c:a copy
はmp3オーディオをそのままコピーします。別のオーディオコーデックに変換する場合は、copy
の代わりにそれを指定できます。 -c:v
を使用して別の動画コーデックを指定したり、-pix_fmt
などの-c:v libx264 -pix_fmt yuv420p
を使用して別のピクセル形式を指定したりすることもできます。 -vf fps=25
は、出力フレームレートを25 fpsにします。音声が長く、画像の後にそれを遮断したい場合は、-shortest
オプションを使用します。
ffmpeg -i in.ffconcat -vf fps=25 out.avi
(2018:in.ffconcatファイルの内容)-これは機能します:
ffconcatバージョン1.0 ファイルテキスト.png 期間30.0 ファイルテキスト.png
これはしませんが
ffconcatバージョン1.0 ファイルtext.png 期間30.0
つまり、2番目のケースでは
ffprobe out.avi -show_entries format=duration -v 0
[FORMAT] duration = 0.040000 [/ FORMAT]