Объединение нескольких видео с разным количеством аудиопотоков и субтитров с помощью ffmpeg

Объединение нескольких видео с разным количеством аудиопотоков и субтитров с помощью ffmpeg

Я хочу добавить логотип водяного знака к видео (загруженному пользователями) и объединить его с Intro. Полученное видео должно иметь тот же формат, что и входное видео.

Проблема начинается, когда загруженное видео имеет более одного аудиопотока и включает субтитры.

Я решил проблему со звуком, используя что-то вроде этой команды.

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

После указания любых операторов сопоставления включаются только сопоставленные потоки. Поэтому вам придется явно сопоставлять любые потоки субтитров. Поскольку их может не быть, я добавил завершающий символ, ?чтобы указать условное назначение.

Я дважды передал входное видео, потому что временные метки субтитров будут неправильными на выходе, так как вступление теперь предшествует видео. Смещение временной метки добавляется ко второму входу, и субтитры сопоставляются с этим каналом. Значение itsoffsetдолжно быть равно длительности вступления (в секундах). Не должно быть никакой необходимости в перекодировании субтитров.

Связанный контент