it-swarm-pt.tech

Sequência de imagens FFMPEG com várias durações

Digamos que eu tenha um arquivo mp3 de 1 minuto de duração. 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 que consigo pensar é apenas copiar as imagens que devem durar mais tempo, por exemplo, ter image1, image2, image3 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 permite fazer isso?

18
Flot2011

Usando o ffmpeg 2.0, existem algumas maneiras de fazer isso:

  1. Um método é usar os horários de modificação do arquivo. Primeiro definir o tempo de modificação dos arquivos de imagem de forma que cada arquivo de imagem tenha um tempo de modificação maior que o anterior; a diferença de tempo é a duração da imagem anterior (com resolução de 1 segundo). Em seguida, use a opção demuxer image2 -ts_from_file 1 . Por exemplo:

    touch -t 01010000.00 image01.png
    touch -t 01010000.03 image02.png
    touch -t 01010000.08 image03.png
    ...
    ffmpeg -ts_from_file 1 -i image%2d.png -i audio.mp3 -c:a copy -vf fps=25 out.avi
    
  2. Outro método é usar o concat demuxer , 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:

    ffconcat version 1.0
    file image01.png
    duration 3
    file image02.png
    duration 5
    file image03.png
    

    Em seguida, forneça este arquivo como entrada para ffmpeg. Por exemplo:

    ffmpeg -i in.ffconcat -i audio.mp3 -c:a copy -vf fps=25 out.avi
    

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 para outro codec de áudio, poderá especificá-lo em vez de copy. Você também pode querer especificar um codec de vídeo diferente com -c:v ou um formato de pixel diferente com -pix_fmt, tal como -c:v libx264 -pix_fmt yuv420p. -vf fps=25 tornará a taxa de quadros de saída de 25 fps. Se o seu áudio for mais longo e você quiser que ele seja cortado após as imagens, use o -shortest opção.

23
mark4o

Assumindo ffmpeg -i in.ffconcat -vf fps=25 out.avi

(2018: conteúdo do arquivo in.ffconcat) - isso funciona:

 ffconcat versão 1.0 
 arquivo text.png 
 duração 30,0 
 arquivo text.png 

enquanto isso não

 ffconcat versão 1.0 
 arquivo text.png 
 duração 30,0 

ou seja, no segundo caso

ffprobe out.avi -show_entries format=duration -v 0

 [FORMATO] 
 Duração = 0,040000 
 [/ FORMATO] 
1
Darek Adamkiewicz