1

Аргументы:

ffmpeg -i in.mp4 -loop 1 -i banner.png -c:a copy -filter_complex "[1:v]fade=in:st=0:d=0.5,fade=out:st=30:d=0.5[watermark]; [0:v][watermark]overlay=(main_w-overlay_w)/2:main_h-overlay_h" out.mp4

Выход:

frame=  131 fps=0.0 q=28.0 size=     110kB time=00:00:05.38 bitrate= 167.9kbits/
...
Past duration 0.999992 too large
frame= 3131 fps=258 q=28.0 size=    2112kB time=00:02:05.17 bitrate= 138.2kbits/
frame= 3131 fps=248 q=28.0 size=    2112kB time=00:02:05.17 bitrate= 138.2kbits/
...

Тогда это зацикливается бесконечно. Я использовал это в качестве примера и только что изменил наложение. out.mp4 содержит ожидаемые результаты.

1 ответ1

3

Вы пропускаете shortest . Поскольку вы имеете дело с несколькими потоками, вы должны указать, когда весь процесс должен быть завершен.

кратчайший (выходной)

Завершите кодирование, когда закончится самый короткий входной поток.

Ваше изображение водяного знака зацикливается бесконечно с -loop . Поэтому вам нужно указать, когда закончить этот цикл. Следующее будет работать для вас.

ffmpeg -i input_video -loop 1 -i input_image -c:a copy -filter_complex "
[1:v]fade=in:st=0:d=0.5,fade=out:st=30:d=0.5[watermark];
[0:v][watermark]overlay=(main_w-overlay_w)/2:main_h-overlay_h:shortest=1" out_video

Поскольку вы используете filter_complex вам нужно использовать shortest с фильтром. Также вам может понадобиться изменить размер изображения, и вы можете использовать scale фильтр для него.

ОБНОВИТЬ

Для масштабирования видео вы можете использовать scale фильтр и связать его с использованным блеклым водяным знаком. Далее будет масштабировано входное видео до 1280x720, и вы можете найти больше вариантов масштабирования здесь.

ffmpeg -i input_video -loop 1 -i input_image -c:a copy -filter_complex "
[0:v]scale=1280:720[scaled];
[1:v]fade=in:st=0:d=0.5,fade=out:st=30:d=0.5[watermark];
[scaled][watermark]overlay=(main_w-overlay_w)/2:main_h-overlay_h:shortest=1" out_video

Надеюсь это поможет!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .