Come ottenere FFMPEG per unire file di immagini non sequenziali? (salta di 3 secondi)


27

Ho un sacco di immagini, che seguono questo schema.

0001.png
0004.png
0007.png
0010.png
0013.png
0016.png
0019.png
...

Sono nell'ordine corretto, ma FFMPEG ignora qualsiasi cosa dopo il primo file, perché non riesce a trovare a 0002.png. Come posso ottenerlo per unire questi file?

Provai

ffmpeg -i %04d.png out.avi

2
Che ne dici di rinominarli temporaneamente, creare l'AVI e poi rinominarli nello schema (3x-2) .png? Bulk Rename Utility @ bulkrenameutility.co.uk/Main_Intro.php è un rinominatore di massa gratuito.
Gyan

Risposte:


18

con ffmpeg 0.11.1 è facile come:

ffmpeg -f image2 -i %*.png out.avi

Dalla manpagina, in un esempio in "Conversione del formato di file audio e video":

Quando si importa una sequenza di immagini, -isupporta anche l'espansione interna di pattern jolly a forma di shell (globbing). Per abbassare la probabilità di interferire con i nomi di file reali e l'espansione glob della shell, si sono tenuti a glob meta caratteri Attivare anteponendo un singolo %carattere, come in foo-%*.jpeg, foo-%?%?%?.jpego foo-00%[234%]%*.jpeg.

Aggiornamento per commento: nelle versioni recenti è ora necessario utilizzare la -i '*.png'sintassi.


3
Questo non ha funzionato per me usando ffmpeg o avconv in Ubuntu 13.04
hellocatfood

2
Questa sembra non essere più un'opzione.
Timmmm,

2
Il glob_sequencetipo di motivo è obsoleto, ma non il globtipo di motivo. La risposta di Mulvya e Peter Cordes funziona.
dott. Sybren,

1
Pattern type 'glob_sequence' is deprecated: use pattern_type 'glob' instead
Serge Stroobandt,

1
Proprio come chiarimento, poiché questa pagina è attualmente il risultato principale in Google per quel messaggio di avviso ( Pattern type 'glob_sequence' is deprecated...): il comando dato da Rymo sopra (in particolare, -i %*.png) causerà l'avvertimento. Per eliminarlo, usa la sintassi leggermente diversa nella risposta di Peter Cordes ( -i '*.png').
James,

19

Oltre alla soluzione alternativa nel mio commento, dovresti essere in grado di utilizzare questa sintassi dalla documentazione di ffmpeg :

ffmpeg -f image2 -pattern_type glob -i '*.png' out.avi

Le virgolette sono importanti, è necessario ffmpeg per vedere il file *, non che la shell lo espanda.


Non funziona per me, ma probabilmente è perché ho una build più vecchia. Accetto questo perché è molto probabile che aiuti i futuri utenti.
Brigand

Secondo la documentazione di ffmpeg dovresti usare '* .png' invece di% 04d.png con il tipo di pattern glob.
Amico di George,

Ciò selezionerebbe quindi tutti i png presenti nella cartella, oltre a 00xx.png, mentre l'OP vuole mettere in coda solo i png% 04d senza preoccuparsi della continuità della numerazione.
Gyan

2
Sono abbastanza sicuro che è necessario inserire *.pngvirgolette singole (quindi '*.png') per evitare che venga espanso da shell in stile Unix (quindi, OSX e Linux ecc.).
evilsoup,

1
Purtroppo gli sviluppatori di ffmpeg rendono un'opzione il supporto per il globbing dei file ! Le build standard di Windows non lo includono.
Timmmm,

9

Da http://www.ffmpeg.org/faq.html : se si dispone di un numero elevato di immagini da rinominare, è possibile utilizzare il comando seguente per alleggerire l'onere. Il comando, usando la sintassi della shell bourne, collega simbolicamente tutti i file nella directory corrente che corrispondono a * jpg alla directory '/ tmp' nella sequenza di 'img001.jpg', 'img002.jpg' e così via.

x=1; for i in *jpg; do counter=$(printf %03d $x); ln -s "$i" /tmp/img"$counter".jpg; x=$(($x+1)); done


L'ho usato per combinare più sequenze seqA-[0001-n].png, seqB-[0001-n].pngecc. Molto più facile che scherzare con il globbing image2 e il filtro concat.
z0r

Per me questo non ha funzionato fino a quando ho sostituito for i in *jpgcon for i in /full/path/*jpg, perché tutti i link simbolici erano rotti
Jezzamon

4

In realtà suggerirei la stessa cosa suggerita da Mulvya. Ogni volta che ho bisogno di fare cose del genere quando mi occupo di rendering di animazioni 3D, ho rinominato i file per renderli sequenziali. È più semplice lavorare in quel modo con molti software diversi a meno che non sia necessario conservare i nomi dei file per qualche motivo. Total Commander è anche un ottimo strumento per la ridenominazione multipla.


Ho finito per fare qualcosa di simile (uno script di rinomina di Python).
Brigand,

3

Per la parte mancante della sequenza, ho usato 2 linee

CONCAT=$(echo $(ls *.png | sort -n -t _ -k 2) | sed -e "s/ /|/g")
ffmpeg -framerate 25 -i "concat:$CONCAT" -c:v libx264 -profile:v high -pix_fmt yuv420p output.mp4

Spero che questo possa aiutare qualcuno in futuro

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.