Error de "sobrescritura" de lapso de tiempo ffmpeg: ¿puede ser un problema de bloqueo / shell?

1

Tengo algunos problemas con lo que creo que debería ser un simple script FFMPEG. Solo estoy tratando de tomar todos los archivos jpg en un directorio dado y llenarlos en un video de lapso de tiempo. Me siento cómodo con todas las opciones de codificador y esas cosas en ffmpeg, pero parece que no puedo obtener la sintaxis correcta.

La línea que estoy intentando debería (sí, lo sé ... "debería") simplemente tomar todas las imágenes .JPG en el directorio y codificarlas como "out.mp4". Pero si nos fijamos en la parte inferior, lo que obtengo es un mensaje para sobrescribir GOPR3974.JPG, que es el segundo archivo en el directorio. Esto implica que por alguna razón no está ocultando todos los archivos correctamente ... He intentado comillas simples, comillas dobles, he intentado

ffmpeg -i GOPR%04d.JPG out.mp4

entonces tiene que haber algo en algún lugar que funcione. Si es importante, esto se está ejecutando en un entorno cygwin usando bash ...

[lwobker:/dtop/hack]$ /usr/local/bin/ffmpeg.exe -i GOPR*.JPG out.mp4
ffmpeg version N-64919-ga613257 Copyright (c) 2000-2014 the FFmpeg developers
  built on Jul 23 2014 00:35:22 with gcc 4.8.3 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads
--enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r
--enable-gnutls --enable-iconv --enable-libass --enable-libbluray
--enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme
--enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame
--enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg
--enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr
--enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab
--enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis
--enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264
--enable-libx265 --enable-libxavs --enable-libxvid --enable-decklink
--enable-zlib
  libavutil      52. 92.101 / 52. 92.101
  libavcodec     55. 69.100 / 55. 69.100
  libavformat    55. 48.101 / 55. 48.101
  libavdevice    55. 13.102 / 55. 13.102
  libavfilter     4. 11.102 /  4. 11.102
  libswscale      2.  6.100 /  2.  6.100
  libswresample   0. 19.100 /  0. 19.100
  libpostproc    52.  3.100 / 52.  3.100
Input #0, image2, from 'GOPR3973.JPG':
  Duration: 00:00:00.04, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: mjpeg, yuvj422p(pc, bt470bg), 1920x1440 [SAR 72:72 DAR
4:3], 25 tbr, 25 tbn, 25 tbc
File 'GOPR3974.JPG' already exists. Overwrite ? [y/N]
ljwobker
fuente

Respuestas:

4

Método 1: usar patrones de secuencia

Lo que realmente necesita es esto, si su primera imagen se llama GOPR0001.JPG:

ffmpeg.exe -i "GOPR%04d.JPG" -pix_fmt yuv420p out.mp4

O si se llama a la primera imagen GOPR3973.JPG, debe darle a ffmpeg el número de inicio para buscar:

ffmpeg.exe -start_number 3973 -i "GOPR%04d.JPG" -pix_fmt yuv420p out.mp4

Método 2: usar patrones de globbing

Si su versión de ffmpeg tiene soporte para globbing (que las compilaciones de Windows no tienen, creo), entonces simplemente puede hacer:

ffmpeg.exe -pattern_type glob -i "GOPR*.JPG" -pix_fmt yuv420p out.mp4

Esto se prefiere si no conoce el número de inicio o simplemente no le importa un control preciso.

Por que no funciona

ffmpeg.exe -i GOPR*.JPG out.mp4

Esto no funciona porque se expandirá a algo como esto (suponiendo que se llame a su primera imagen GOPR0001.JPG):

ffmpeg.exe -i GOPR0001.JPG GOPR0002.JPG  out.mp4

Dado que ffmpeg trata la última opción de argumento sin nombre (es decir, cualquier cosa sin un encabezado -) como el nombre del archivo de salida, GOPR2.JPGsería la salida, y cualquier cosa hasta out.mp4no se aplicará.

Algunas pistas

  • -pix_fmt yuv420pes necesario para convertir del espacio de color YUV 4: 2: 2 del JPEG a submuestreo 4: 2: 0. De lo contrario, algunos jugadores (la mayoría no basados ​​en FFmpeg) no podrán mostrar el video

  • Controle la calidad configurando la -crf 23opción y eligiendo algo entre 18 y 28, donde menor significa mejor calidad.

  • Es posible que desee establecer la velocidad de cuadros según la cual se capturaron los cuadros de entrada (imágenes). Haz esto corriendo ffmpeg.exe -framerate 30 -start_number …. Si no especifica la velocidad de fotogramas, ffmpeg asumirá que sus fotogramas originales se grabaron a 25 Hz.

  • Lea la parte image2demuxer del manual.

  • Las comillas dobles siempre son buenas para evitar la expansión de los patrones.

slhck
fuente