web-dev-qa-db-ja.com

さまざまな期間のFFMPEG画像シーケンス

たとえば、1分の長さのmp3ファイルがあるとします。そして、私は20のPNG画像を持っています。これらの画像と音声をビデオファイルに結合したいが、各画像を画面上で3秒間持続させたくない、一部の画像を5秒間持続させたい、他の画像を1秒間持続させたいなど。

私が考えることができる唯一の方法は、もっと長く続くはずの画像を単にコピーすることです。 image1、image2、image3がまったく同じになるようにすると、ビデオの時間が3倍になります。

ただし、これは非常に時間とスペースを消費します。 ffmpegにそれを可能にするスイッチ/パラメーターはありますか?

18
Flot2011

Ffmpeg 2.0を使用するには、いくつかの方法があります。

  1. 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
    
  2. 別の方法は 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オプションを使用します。

23
mark4o

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] 
1