Gostaria de concatenar uma imagem JPG com um clipe MP4 (Windows 10). A imagem deve ser reproduzida silenciosamente pelos primeiros 5 segundos do clipe resultante, então o vídeo original deve seguir. O JPG precisa ser dimensionado para corresponder à resolução do clipe, a taxa de quadros e a resolução do clipe original devem permanecer inalteradas. Gostaria de fazer isso sem recodificar o vídeo, pois tenho mais de 100 clipes para processar:
ffmpeg -y -loop 1 -t 5 -i %1.jpg -f lavfi -t 1 -i anullsrc -i %1.mp4 -filter_complex "[0:v][2:v]scale2ref[logo][video]; [logo]setsar=sar=1[logo]; [logo][1:a][video][2:a]concat=n=2:v=1:a=1" %1-output.mp4
No entanto, o ffmpeg está preso no quadro 69 e não avança. Se eu encerrar o programa, acabo com 5 segundos de imagem e alguns quadros do áudio/vídeo de origem como resultado. O que estou fazendo errado?
ps Ffmpeg é a versão mais recente.
O problema está relacionado à incompatibilidade entre a taxa de quadros do vídeo e a taxa de quadros da imagem em loop (provavelmente também há um bug no FFmpeg 7.1).
Caso não saibamos a taxa de quadros, podemos usar filtros
tpad
eoverlay
, em vez de usar loop e concat:Usando o FFmpeg versão 7.1, também podemos evitar
scale2ref
(usarscale=rw:rh
em vez disso):ffmpeg -y -i 1.jpg -f lavfi -t 5 -i anullsrc -i 1.mp4 -filter_complex "[2:v]tpad=start_duration=5[pv];[0:v][2:v]scale=rw:rh[logo];[logo]setsar=sar=1[logo];[pv][logo]overlay=enable=between(t\,0\,5)[outv];[1:a][2:a]concat=n=2:v=0:a=1[outa]" -map "[outv]" -map "[outa]" 1-output.mp4
Usando o FFmpeg versão 5.1.2:
ffmpeg -y -i 1.jpg -f lavfi -t 5 -i anullsrc -i 1.mp4 -filter_complex "[2:v]tpad=start_duration=5[pv];[0:v][pv]scale2ref[logo][video];[logo]setsar=sar=1[logo];[video][logo]overlay=enable=between(t\,0\,5)[outv];[1:a][2:a]concat=n=2:v=0:a=1[outa]" -map "[outv]" -map "[outa]" 1-output.mp4
[2:v]tpad=start_duration=5[pv]
- adicione quadros pretos ao início do vídeo[pv]
(o preenchimento tem a mesma taxa de quadros do vídeo de entrada).[0:v][2:v]scale=rw:rh[logo];[logo]setsar=sar=1[logo]
- dimensione a imagem do logotipo para o tamanho do vídeo.[video][logo]overlay=enable=between(t\,0\,5)[outv]
- sobreponha o logotipo sobre o vídeo, durante os primeiros 5 segundos (cubra apenas os quadros preenchidos).[2:a]concat=n=2:v=0:a=1[outa]
- concatenar os 5 segundosanullsrc
com o áudio original.Testando (usando a versão 5.1.2):
Crie um exemplo de vídeo e imagem de entrada:
ffmpeg -y -f lavfi -i testsrc=s=100x100:r=1:d=1 -frames:v 1 -update 1 1.jpg
ffmpeg -y -f lavfi -i testsrc=size=192x108:rate=10 -f lavfi -i sine=frequency=200 -acodec aac -t 30 1.mp4
Sem definir a taxa de quadros, o FFmpeg fica travado:
ffmpeg -y -loop 1 -t 5 -i 1.jpg -f lavfi -t 5 -i anullsrc -i 1.mp4 -filter_complex "[0:v][2:v]scale2ref[logo][video]; [logo]setsar=sar=1[logo]; [logo][1:a][video][2:a]concat=n=2:v=1:a=1" 1-output.mp4
Observação: a taxa de quadros padrão é 25 fps.
Ao definir a taxa de quadros, ele funciona com o FFmpeg 5.1.2 (mas trava ao usar o FFmpeg 7.1):
ffmpeg -y -loop 1 -framerate 10 -t 5 -i 1.jpg -f lavfi -t 5 -i anullsrc -i 1.mp4 -filter_complex "[0:v][2:v]scale2ref[logo][video]; [logo]setsar=sar=1[logo]; [logo][1:a][video][2:a]concat=n=2:v=1:a=1" 1-output.mp4