Criar vídeo a partir de imagens e áudio com diferentes durações de imagem usando o FFMPEG?

0

O que eu quero fazer:

Eu tenho x quantidade de imagens png / jpg, e eu quero mostrá-las por uma quantidade variável de duração, algumas mais e um tempo menor.

  • a1.jpg A primeira foto permanece por 3 segundos
  • a2.png permanece por 10 segundos
  • a3.jpg permanece até o final do áudio

O vídeo deve ser tão longo quanto o audio.mp3

Este é o meu código até agora depois de ler a documentação, não tenho certeza o que está errado, eu recebo vídeo corrompido sem som e só mostra a última imagem.

Também gostaria de centralizar as imagens, se possível.

ffmpeg -y \
  -loop 1 -t 1 -i a1.jpg \
  -loop 1 -t 1 -i a2.jpg \
  -loop 1 -t 4 -i a3.jpg \
  -loop 1 -t 1 -i a4.png \
  -loop 1 -t 1 -i a5.png \
  -i audio.mp3 \
  -c:v libx264 -pix_fmt yuv420p -c:a copy video.mp4

experimentar

ffmpeg -y -framerate 15 \
  -loop 1 -t 1 -i a1.jpg \
  -loop 1 -t 1 -i a2.jpg \
  -loop 1 -t 4 -i a3.jpg \
  -loop 1 -t 1 -i a4.png \
  -loop 1 -t 1 -i a5.png \
  -i audio.mp3 \
  -c:v libx264 -pix_fmt yuv420p -c:a copy \
  -filter_complex " \
  [0]setdar=16/9[a1],[a1]scale=720x406[a];[1]setdar=16/9[b1],[b1]scale=720x406[b];[2]setdar=16/9[c1],[c1]scale=720x406[c];[3]setdar=16/9[d1],[d1]scale=720x406[d];[4]setdar=16/9[e1],[e1]scale=720x406[e]; 
  [a][b][c][d][e]concat=n=5,format=yuv420p[v],[v]scale=720x406[v1],[v1]setdar=16/9[v2]" \
  -map "[v2]" -c:a copy out.mp4
Muhammad Umer
fonte

Respostas:

2

Modelo básico é

ffmpeg -y \
  -loop 1 -t 1 -i a1.jpg \
  -loop 1 -t 1 -i a2.jpg \
  -loop 1 -t 4 -i a3.jpg \
  -loop 1 -t 1 -i a4.png \
  -loop 1 -i a5.png \
  -i audio.mp3 \
  -filter_complex "concat=n=5" -shortest \
  -c:v libx264 -pix_fmt yuv420p -c:a aac video.mp4

o t especificação para cada imagem define sua duração. o t a última imagem deve ser omitida se você quiser que o vídeo dure até que o áudio termine.

Eu uso o filtro de concatenação para unir todas as entradas de vídeo. A boa prática é rotular quais entradas o filtro de concat se unirá, mas se não for especificado, o filtro irá capturar o primeiro N -i entradas, onde N é o valor definido no filtro de concat. Todas as imagens devem ter a mesma resolução e proporção.

Seu dado comando copia o áudio, mas o MP3, apesar de permitido, não é padrão em MP4, e alguns players, como o Quicktime, não reproduzem o arquivo, então eu mudei para o AAC.


Para imagens de tamanhos diferentes, altere filter_complex para

"[0]scale=W:H:force_original_aspect_ratio=decrease,pad=W:H:(ow-iw)/2:(oh-ih)/2,setsar=1[i0];
 [1]scale=W:H:force_original_aspect_ratio=decrease,pad=W:H:(ow-iw)/2:(oh-ih)/2,setsar=1[i1];
 [2]scale=W:H:force_original_aspect_ratio=decrease,pad=W:H:(ow-iw)/2:(oh-ih)/2,setsar=1[i2];
 [3]scale=W:H:force_original_aspect_ratio=decrease,pad=W:H:(ow-iw)/2:(oh-ih)/2,setsar=1[i3];
 [4]scale=W:H:force_original_aspect_ratio=decrease,pad=W:H:(ow-iw)/2:(oh-ih)/2,setsar=1[i4];
 [i0][i1][i2][i3][i4]concat=n=5"

W e H devem ser substituídos por valores numéricos de largura e altura do vídeo alvo.

Gyan
fonte
Seria possível dimensionar cada imagem para ter altura de resolução definida. Então, digamos que eu defina a resolução para 720/460 ... e se qualquer altura da imagem for menor do que isso, dimensione-a para 460. Ter a mesma altura e largura exigiria alguma outra operação para torná-las todas assim
Muhammad Umer
Bem, a mesma resolução - W e H - é necessária, seja dentro ou fora do ffmpeg.
Gyan
Posso supor que a primeira imagem é a resolução de destino?
Gyan
Ok, sim, isso pode ser assumido
Muhammad Umer
1
Sim, mas a saída não será amplamente compatível.
Gyan