ffmpeg - loop infinito ao adicionar marca d'água

1

Argumentos:

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

Saída:

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/
...

Em seguida, faz um loop infinitamente. Eu usei este como exemplo e apenas modifiquei a sobreposição. out.mp4 contém os resultados esperados.

    
por awalmartbag 23.07.2015 / 01:47

1 resposta

3

Você está com falta de shortest . Como você está lidando com múltiplos fluxos, você precisa dizer quando todo o processo precisa ser concluído.

-shortest (output)

Finish encoding when the shortest input stream ends.

Sua imagem de marca d'água apresenta um loop infinito com -loop . Então você precisa especificar quando terminar este loop. A seguir funcionará para você.

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

Conforme você usa filter_complex , é necessário usar shortest com o filtro. Além disso, você pode precisar redimensionar a imagem e usar scale para filtrá-la.

UPDATE

Para dimensionar o vídeo, você pode usar o filtro scale e vinculá-lo à marca d'água desbotada que você usou. A seguir, o vídeo de entrada será dimensionado para 1280x720 e você poderá encontrar mais opções de dimensionamento aqui .

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

Espero que isso ajude!

    
por 23.07.2015 / 08:19

Tags