web-dev-qa-db-ja.com

FFmpegによる可変フレームレート

各画像間にそれぞれの遅延がある5つの画像があると仮定しましょう。

  1. 60ms;
  2. 54ms;
  3. 70ms;
  4. 23ms;
  5. 40ms;

どうすればその情報をFFmpegに伝えることができますか?

1
Nicke Manarin

-concatオプションを使用することになりました。これは基本的に、各入力画像の名前と期間が記載されたテキストファイルです。

0
Nicke Manarin

https://stackoverflow.com/q/28086775/5726027 に示されている複数のツールの方法に加えて、単一の長いコマンドを使用して実行することもできます。

ffmpeg -i a1.jpg -i a2.jpg -i a3.jpg -i a4.jpg -i a5.jpg
       -filter_complex
        "[1]settb=1/1000,setpts=PTS+0.06/TB[b];
         [2]settb=1/1000,setpts=PTS+0.054/TB[c];
         [3]settb=1/1000,setpts=PTS+0.07/TB[d];
         [4]split[4a][4b];
         [4a]settb=1/1000,setpts=PTS+0.023/TB[e];
         [4b]settb=1/1000,setpts=PTS+0.04/TB[f];
         [0][b][c][d][e][f]concat=n=6"
       -vsync vfr -r 1000 -video_track_timescale 1000 vt.mp4

最初の画像を除く各画像には、タイムベースとタイムスタンプのフィルターが適用されます。ミリ秒の精度が必要なため、タイムベースは1/1000秒= 1ミリ秒に設定されています。次に、setptsは必要な遅延(秒単位)を追加します。ビデオの最後のフレームは、事実上、コーデックのフレームレートによって決定されるデフォルトの長さであると私は信じているので、最後の画像を複製する必要があります。最初のコピーでは遅延に応じてPTS値が設定され、2番目のコピーではPTSが最後のイメージの目的の期間に設定されます。

1
Gyan