Digamos que eu tenho um arquivo mp3 de 1 minuto. E eu tenho 20 imagens png. Quero combinar essas imagens e um áudio em um arquivo de vídeo, mas não quero que cada imagem dure 3 segundos na tela, quero que algumas imagens durem 5 segundos, outras 1 segundo etc.
A única maneira de pensar é apenas copiar as imagens que devem durar mais tempo, por exemplo, para que a imagem1, a imagem2, a imagem3 sejam exatamente iguais, isso me dá 3x mais tempo no vídeo.
No entanto, isso consome muito tempo e espaço. Existe alguma opção / parâmetro no ffmpeg que me permita fazer isso?
Respostas:
Usando o ffmpeg 2.0, existem algumas maneiras de fazer isso:
Um método é usar os tempos de modificação do arquivo. Primeiro, defina o tempo de modificação dos arquivos de imagem para que cada arquivo de imagem tenha um tempo de modificação maior que o anterior; a diferença horária é a duração da imagem anterior (com 1 segundo de resolução). Em seguida, use a opção desmuxer image2
-ts_from_file 1
. Por exemplo:Outro método é usar o
concat
desmuxer , que leva uma lista de arquivos para concatenar, com durações opcionais. Primeiro, crie um arquivo listando suas imagens e durações com a seguinte aparência:Em seguida, forneça esse arquivo como entrada para ffmpeg. Por exemplo:
Pode ser necessário duplicar o último arquivo após a duração final.
-c:a copy
copia o áudio mp3 como está; se você quiser convertê-lo em outro codec de áudio, poderá especificar isso em vez decopy
. Você também pode especificar um codec de vídeo diferente-c:v
ou um formato de pixel diferente-pix_fmt
, como-c:v libx264 -pix_fmt yuv420p
.-vf fps=25
fará a taxa de quadros de saída 25 fps. Se o seu áudio for mais longo e você desejar cortá-lo após as imagens, use a-shortest
opçãofonte
-c:v libx264 -profile:v baseline -pix_fmt yuv420p out.mp4
vez de out.avi ou tente outro player, como mpv ou ffplay. Verifique também se você está usando uma versão atual do FFmpeg e duplique o último nome do arquivo de imagem após a duração final.Assumindo
ffmpeg -i in.ffconcat -vf fps=25 out.avi
(2018: conteúdo do arquivo in.ffconcat) - funciona:
enquanto isso não
ou seja, no segundo caso
ffprobe out.avi -show_entries format=duration -v 0
fonte