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

1

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

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

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

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Значение должно быть равно длительности интро (в секундах). Там не должно быть необходимости транскодировать субтитры.

Gyan
источник