Chiarimento per l'opzione di input ffmpeg con file di immagine come input


34

Ho alcune immagini e mi piacerebbe fare una gif animata con ffmpeg. Le immagini hanno nomi come:

837_1.png
838_1.png
...

Sto cercando di capire l' opzione della riga di comando -i di ffmpeg ma mi sto schiantando contro alcuni problemi.

Se non specifico nulla, mi chiede di sostituire i file:

ffmpeg -i * -vcodec libx264 out.mp4

ffmpeg version 1.2.1 Copyright (c) 2000-2013 the FFmpeg developers
  built on Jul 26 2013 20:18:03 with Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/1.2.1 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-avresample --enable-vda --cc=cc --host-cflags= --host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libxvid
  libavutil      52. 18.100 / 52. 18.100
  libavcodec     54. 92.100 / 54. 92.100
  libavformat    54. 63.104 / 54. 63.104
  libavdevice    54.  3.103 / 54.  3.103
  libavfilter     3. 42.103 /  3. 42.103
  libswscale      2.  2.100 /  2.  2.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  2.100 / 52.  2.100
Input #0, image2, from '358_1.png':
  Duration: 00:00:00.04, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: png, rgb24, 550x550, 25 tbr, 25 tbn, 25 tbc
File '359_1.png' already exists. Overwrite ? [y/N]

E se provo ad usare uno dei formati più utilizzati (% d) in internet .. ffmpeg non trova i file:

fmpeg -i '%3d_1.png' -vcodec libx264 out.mp4

ffmpeg version 1.2.1 Copyright (c) 2000-2013 the FFmpeg developers
  built on Jul 26 2013 20:18:03 with Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/1.2.1 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-avresample --enable-vda --cc=cc --host-cflags= --host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libxvid
  libavutil      52. 18.100 / 52. 18.100
  libavcodec     54. 92.100 / 54. 92.100
  libavformat    54. 63.104 / 54. 63.104
  libavdevice    54.  3.103 / 54.  3.103
  libavfilter     3. 42.103 /  3. 42.103
  libswscale      2.  2.100 /  2.  2.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  2.100 / 52.  2.100
[image2 @ 0x7f963a006600] Could find no file with with path '%3d_1.png' and index in the range 0-4
%3d_1.png: No such file or directory

Quindi .. ecco la domanda, come usare l' opzione della riga di comando -i con ffmpg?

Per motivi di chiarezza, sono su Mac OSX 10.8, ffmpeg versione 1.2.1, zsh 4.3.11

Risposte:


47

Senza ulteriori opzioni, il image2demuxer di ffmpeg cercherà una sequenza che inizia con 0. Controllerà anche intorno a questo indice, con un intervallo predefinito di 5 (ecco perché si lamenterà di nessun indice nell'intervallo 0–4). Per la documentazione , è necessario impostare il numero iniziale se si desidera iniziare con un indice arbitrario, come 837.

ffmpeg -start_number 837 -i '%3d_1.png' -c:v libx264 out.mp4

Spazio colore nella conversione da PNG a H.264

Poiché i file PNG usano lo spazio colore RGB per rappresentare i pixel, la conversione in H.264 finirebbe per essere YUV 4: 4: 4 ( non sottocampionato ). Il video risultante potrebbe non essere riproducibile su tutti i lettori, in particolare qualsiasi cosa non basata su FFmpeg. Il tuo giocatore mostrerebbe solo cornici nere, o possibilmente crash. Per risolvere il problema, modifica il formato dei pixel in YUV 4: 2: 0:

ffmpeg -start_number 837 -i '%3d_1.png' -c:v libx264 -pix_fmt yuv420p out.mp4

Per controllare la qualità, utilizzare l' -crfopzione. Consulta la guida alla codifica x264 per maggiori informazioni.

Perché il *glob non funziona

Non utilizzare l' *opzione come input. La shell lo espanderà a tutti i file nella directory corrente prima di ffmpegvederlo, quindi il comando si espanderà a ffmpeg -i file1 file2 … filen. Dal momento che tutti i file di input hanno ffmpegbisogno -idell'opzione, prenderà invece file2 … filencome file di output e li sovrascriverà. Non bene.


risposta molto completa! e hai anche qualche consiglio su GIF animate?
nkint,

Per le GIF animate, vuoi aggiornare a ffmpeg versione 2.0 e successive, perché hanno notevolmente migliorato la qualità visiva. La pagina di download contiene alcuni collegamenti a build statiche per OS X. Per ffmpeg precedente, vedi: ffmpeg converte i video .flv in .gif con una qualità terribile
slhck,

In realtà, non solo controlla + 0..4 ma anche 8,16,32,64 ecc. Ciò è evidente quando si utilizzano gli URL HTTP. Tuttavia, image2non riesce a riconoscere che 200 OKè l'equivalente di "file found", quindi non smette di cercare.
MSalters,

1
Ricevo la stessa cosa anche dopo aver cercato di attuare i tuoi suggerimenti. I miei file sono chiamati DSCxxxxx.jpgdove xxxxxc'è un numero di 5 cifre che inizia con zero (nota che non ho caratteri di sottolineatura). Tuttavia, dopo l'esecuzione ffmpeg -r 30 -start_number 04606 -i DSC%d.jpg out.mp4ottengo lo stesso errore del post originale sopra
Anonimo,

@jphollowed Hai messo il modello del nome file tra virgolette?
slhck,

29

Il globbing può essere abilitato specificando l' -pattern_type globopzione:

ffmpeg -pattern_type glob -i '*.png' -vcodec libx264 out.mp4

2
Modo molto migliore :)
Gustav,

3
Solo questo ha funzionato per me. Non c'è modo di ottenere questo xxx%d.png, xxx%3d.png, 'xxx%d.png'o 'xxx%3d.png'cosa di lavoro
yPhil

Ottengo lo stesso errore dopo aver provato questo:[image2 @ 0x2552560] Could find no file with path '*.jpg' and index in the range 0-4 *.jpg: No such file or directory
Anonimo il

È stato selezionato il tipo di motivo 'glob' ma il globbing non è supportato da questa build libavformat [usando Windows ffmpeg] [oof, avrebbe dovuto scorrere una risposta verso il basso]
Katastic Voyage

7

Nota: Pattern globbing non funziona in Windows (e potrebbe non essere mai dovuto alla mancanza di supporto per globbing in libavfilter in Windows.) Quindi, se lo fai in Windows, dovrai rinominare i file in modo che siano numerati in sequenza e senza lacune.

Puoi rinominarli con una semplice riga di comando di Powershell:

dir *.jpg | %{$x=0} {Rename-Item $_ -NewName “Base$x”; $x++ }

Questo restituirà file1.jpg file2.jpg... file10.jpgche se si ordina in ordine alfabetico finirebbe file1.jpg, file10.jpg...file2.jpg
Stib

Non dovrebbe essere Base $ x.jpg? Così com'è, il tuo ha rinominato tutto il mio e ha ucciso le estensioni dei file.
Katastic Voyage,

5

modo migliore per rinominare con PowerShell (preservare l'ordine):

dir *.jpg | %{$x=0} {Rename-Item $_ -NewName "Base$($x.tostring('000000')).jpg"; $x++ }

Fa dirsempre restituire i file in ordine alfabetico? Sarebbe più sicuro aggiungere a sort-objectnel mix?
Stib
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.