
Я хочу добавить логотип водяного знака к видео (загруженному пользователями) и объединить его с 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
должно быть равно длительности вступления (в секундах). Не должно быть никакой необходимости в перекодировании субтитров.