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

13

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 de pensar é apenas copiar as imagens que devem durar mais tempo, por ex. ter image1, image2, image3 para ser exatamente o mesmo, isso me dá 3x mais tempo em vídeo.

No entanto, isso é muito demorado e consome espaço. Existe algum switch / parâmetro no ffmpeg que me permita fazer isso?

    
por Flot2011 09.07.2013 / 12:26

2 respostas

17

Usando o ffmpeg 2.0, há algumas maneiras de fazer isso:

  1. Um método é usar tempos de modificação de arquivos. Primeiro defina o horário 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 de tempo é a duração da imagem anterior (com resolução de 1 segundo). Em seguida, use a opção image2 demuxer -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 pega uma lista de arquivos para concatenar , com durações opcionais. Primeiro, crie um arquivo com as imagens e as durações que se parecem com isso:

    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 o ffmpeg. Por exemplo:

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

Você pode precisar 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 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 , 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ê quiser cortá-lo após as imagens, use a opção -shortest .

    
por 15.07.2013 / 07:33
1

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

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

ffconcat version 1.0
file text.png
duration 30.0
file text.png

enquanto isso não acontece

ffconcat version 1.0
file text.png
duration 30.0

ou seja, no segundo caso

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

[FORMAT]
duration=0.040000
[/FORMAT]
    
por 12.03.2018 / 23:42