Sequenza di immagini FFMPEG con varie durate


16

Diciamo che ho un file mp3 della durata di 1 minuto. E ho 20 immagini png. Voglio combinare queste immagini e un audio in un file video, ma non voglio che ciascuna immagine duri 3 secondi sullo schermo, voglio che alcune immagini durino 5 secondi, altre 1 secondo ecc.

L'unico modo in cui riesco a pensare è solo copiare le immagini che dovrebbero durare più tempo, ad esempio per avere image1, image2, image3 per essere esattamente lo stesso, questo mi dà 3 volte più tempo in video.

Tuttavia, questo richiede molto tempo e spazio. C'è qualche interruttore / parametro in ffmpeg che mi permette di farlo?


Come hai scoperto ffmpeg dovrebbe visualizzare ogni immagine per la stessa lunghezza. Se vuoi variare la lunghezza dovrai duplicare le immagini in anticipo o creare video separati per ogni durata desiderata e poi concatenarli. Forse alcuni altri utenti hanno idee migliori, ma questo tipo di attività potrebbe essere più semplice con un editor come Kdenlive, ecc.
Llogan,

Lo sto facendo dallo script php, quindi l'editor non è quello che sto cercando.
Flot2011

Risposte:


21

Usando ffmpeg 2.0 ci sono un paio di modi per farlo:

  1. Un metodo consiste nell'utilizzare i tempi di modifica dei file. Innanzitutto impostare il tempo di modifica dei file di immagine in modo che ogni file di immagine abbia un tempo di modifica maggiore di quello precedente; la differenza di tempo è la durata dell'immagine precedente (con una risoluzione di 1 secondo). Quindi utilizzare l'opzione demuxer image2 -ts_from_file 1. Per esempio:

    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. Un altro metodo consiste nell'utilizzare il concatdemuxer , che richiede un elenco di file da concatenare, con durate opzionali. Innanzitutto crea un file che elenchi le tue immagini e durate che assomigli a questo:

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

    Quindi fornire questo file come input per ffmpeg. Per esempio:

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

Potrebbe essere necessario duplicare l'ultimo file dopo la durata finale. -c:a copycopia l'audio mp3 così com'è; se vuoi convertirlo in un altro codec audio, puoi specificarlo invece di copy. È inoltre possibile specificare un codec video diverso con -c:vo un formato pixel diverso con -pix_fmt, ad esempio -c:v libx264 -pix_fmt yuv420p. -vf fps=25renderà la frequenza dei fotogrammi in uscita di 25 fps. Se il tuo audio è più lungo e vuoi che venga tagliato dopo le immagini, usa l' -shortestopzione.


Qualche idea sul perché questo non sembra funzionare (voglio dire, ho seguito la seconda (e ho provato a prima) opzione alla lettera ma emette solo un video nero senza immagini o le immagini lampeggiano solo per un fotogramma, non diversi secondi come specificato nel file ffconcat.
sup

@sup: questo funziona ancora per me. Se il video è nero, il tuo lettore potrebbe non supportare il formato video che stai utilizzando; provare -c:v libx264 -profile:v baseline -pix_fmt yuv420p out.mp4invece di out.avi o provare un altro lettore come mpv o ffplay. Assicurati anche di utilizzare una versione corrente di FFmpeg e duplica l'ultimo nome del file immagine dopo la durata finale.
mark4o

Uhm, strano, usa Up mpv e la build statica di ffmpeg scaricata da ffmpeg.org e ignora solo le durate. Comunque, ho trovato un altro modo per farlo, quindi non è così importante: ffmpeg.org/pipermail/ffmpeg-user/2015-July/027702.html
sup

1

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

(2018: contenuto del file in.ffconcat) - funziona:

ffconcat versione 1.0
file text.png
durata 30,0
file text.png

mentre questo non lo fa

ffconcat versione 1.0
file text.png
durata 30,0

cioè nel secondo caso

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

[FORMATO]
durata = 0.040000
[/FORMATO]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.