Aclaración para la opción de entrada ffmpeg con archivos de imagen como entrada

34

Tengo algunas imágenes y me gustaría hacer un gif animado con ffmpeg. Las imágenes tienen nombres como:

837_1.png
838_1.png
...

Estoy tratando de dejar de entender la opción de línea de comando -i de ffmpeg pero me estoy bloqueando contra algunos problemas.

Si no especifico nada, me pide que reemplace los archivos:

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]

Y si trato de usar uno de los formatos más utilizados (% d) en Internet ... ffmpeg no encuentra los archivos:

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

Entonces ... aquí está la pregunta, ¿cómo usar la opción de línea de comando -i con ffmpg?

En aras de la claridad, estoy en Mac OSX 10.8, ffmpeg versión 1.2.1, zsh 4.3.11

nkint
fuente

Respuestas:

47

Sin más opciones, el image2demuxer de ffmpeg buscará una secuencia que comience con 0. También verificará alrededor de este índice, con un rango predeterminado de 5 (es por eso que se quejará de que no hay índice en el rango 0-4). Según la documentación , debe establecer el número de inicio si desea comenzar en un índice arbitrario, como 837.

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

Espacio de color en conversión de PNG a H.264

Dado que los archivos PNG usan el espacio de color RGB para representar píxeles, la conversión a H.264 terminaría siendo YUV 4: 4: 4 ( sin submuestreo ). Es posible que el video resultante no se pueda reproducir en todos los jugadores, especialmente en cualquier cosa que no esté basada en FFmpeg. Su reproductor solo mostraría cuadros negros, o posiblemente se estrellaría. Para solucionarlo, cambie el formato de píxel a YUV 4: 2: 0:

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

Para controlar la calidad, use la -crfopción. Consulte la guía de codificación x264 para obtener más información.

¿Por qué el *globo no funciona?

No utilice el *como una opción de entrada. El shell lo expandirá a todos los archivos en el directorio actual antes de ffmpegverlo, por lo que el comando se expandirá a ffmpeg -i file1 file2 … filen. Como todos los archivos de entrada ffmpegnecesitan la -iopción, tomará file2 … filencomo archivos de salida y los sobrescribirá. No está bien.

slhck
fuente
respuesta muy completa! ¿y también tienes algún consejo sobre gif animados?
nkint
Para los GIF animados, desea actualizar a ffmpeg versión 2.0 y superior, porque mejoraron en gran medida la calidad visual. La página de descarga tiene algunos enlaces a compilaciones estáticas para OS X. Para ver ffmpeg anterior, ffmpeg convierte el video .flv a .gif con una calidad horrible
slhck
De hecho, no solo verifica + 0..4 sino también 8,16,32,64, etc. Esto se nota cuando se usan URL de HTTP. Sin embargo, image2no reconoce que 200 OKes el equivalente de "archivo encontrado", por lo que no deja de buscar.
MSalters
1
Recibo lo mismo incluso después de intentar implementar sus sugerencias. Mis archivos se nombran DSCxxxxx.jpgdonde xxxxxhay un número de 5 dígitos que comienza con cero (tenga en cuenta que no tengo guiones bajos). Aún así, después de ejecutar ffmpeg -r 30 -start_number 04606 -i DSC%d.jpg out.mp4, recibo el mismo error que en la publicación original anterior
Anónimo
@jphollowed ¿Puso el patrón de nombre de archivo entre comillas?
slhck
29

Globbing se puede habilitar especificando la -pattern_type globopción:

ffmpeg -pattern_type glob -i '*.png' -vcodec libx264 out.mp4
yohanson
fuente
2
Mucho mejor manera :)
Gustav
3
Solo esto funcionó para mí. No hay manera de conseguir esto xxx%d.png, xxx%3d.png, 'xxx%d.png'o 'xxx%3d.png'algo de trabajo
yPhil
Me sale el mismo error después de intentar esto:[image2 @ 0x2552560] Could find no file with path '*.jpg' and index in the range 0-4 *.jpg: No such file or directory
Anónimo
Se seleccionó el tipo de patrón 'glob' pero esta generación de libavformat no admite el globbing [usando Windows ffmpeg] [oof, debería haber desplazado hacia abajo una respuesta]
Katastic Voyage
7

Nota: el patrón de bloqueo no funciona en Windows (y puede que nunca se deba a la falta de soporte para el bloqueo en libavfilter en Windows). Entonces, si lo hace en Windows, deberá cambiar el nombre de los archivos para que estén numerados secuencialmente y sin huecos.

Puede cambiarles el nombre con una simple línea de comando de Powershell:

dir *.jpg | %{$x=0} {Rename-Item $_ -NewName “Base$x”; $x++ }
Bill Westrup
fuente
Esto volverá file1.jpg file2.jpg... file10.jpgque si ordena alfabéticamente terminaría file1.jpg, file10.jpg...file2.jpg
stib
¿No debería ser Base $ x.jpg? Tal como está, el suyo cambió el nombre de todos los míos y eliminó las extensiones de archivo.
Katastic Voyage
5

Mejor forma de cambiar el nombre con PowerShell (preservar el orden):

dir *.jpg | %{$x=0} {Rename-Item $_ -NewName "Base$($x.tostring('000000')).jpg"; $x++ }
pBac
fuente
¿ dirSiempre devuelve los archivos ordenados alfabéticamente? ¿Sería más seguro agregar un sort-objecta la mezcla?
stib