ffmpeg を使用して、異なるオーディオと字幕のストリームカウントを持つ複数のビデオを連結する

ffmpeg を使用して、異なるオーディオと字幕のストリームカウントを持つ複数のビデオを連結する

動画(ユーザーがアップロードしたもの)に透かしロゴを追加し、それをイントロと連結したいと考えています。結果の動画は入力動画と同じ形式である必要があります。

問題は、アップロードされたビデオに複数のオーディオ ストリームがあり、字幕が含まれている場合に発生します。

このコマンドのようなものを使用することでオーディオの問題を解決しました。

ffmpeg -i intro.mp4 -i input.mkv -i logo.png -filter_complex "[0:v] scale=480:270,setdar=16/9 [a]; [1:v] scale=480:270,setdar=16/9 [b]; [2:0] scale=480:270 [wm]; [b][wm] overlay[ov]; [a][0:a:0][0:a:0] [ov][1:a:0][1:a:1] concat=n=2:v=1:a=2 [vd] [a0] [a1]" -map "[vd]" -map "[a0]" -map "[a1]" -y output.mkv

しかし、出力には字幕が含まれません。

誰か助けてくれませんか?

答え1

使用

ffmpeg -i intro.mp4 -i input.mkv -itsoffset 4.5 -i input.mkv -i logo.png
  -filter_complex
     "[0:v] scale=480:270,setdar=16/9 [a];
      [1:v] scale=480:270,setdar=16/9 [b];
      [3:0] scale=480:270 [wm];
      [b][wm] overlay[ov];
      [a][0:a:0][0:a:0] [ov][1:a:0][1:a:1] concat=n=2:v=1:a=2 [vd] [a0] [a1]"
  -map "[vd]" -map "[a0]" -map "[a1]" -map 2:s? -c:s copy -y output.mkv

マップ ステートメントを指定すると、マップされたストリームのみが含まれます。したがって、字幕ストリームを明示的にマップする必要があります。字幕ストリームが存在しない可能性があるため、?条件付き割り当てを示す末尾を追加しました。

イントロがビデオの前にあるため、出力の字幕のタイムスタンプが間違ってしまうため、入力ビデオを 2 回入力しました。2 番目の入力にタイムスタンプ オフセットが追加され、そのフィードから字幕がマッピングされます。値はitsoffsetイントロの長さ (秒単位) と同じである必要があります。字幕をトランスコードする必要はありません。

関連情報