ffmpeg erro de “overwrite” de lapso de tempo - pode ser um problema de globbing / shell?

1

Estou tendo alguns problemas com o que eu acho que deveria ser um simples script FFMPEG. Eu só estou tentando pegar todos os arquivos jpg em um determinado diretório e preenchê-los em um vídeo de lapso de tempo. Estou confortável com todas as opções de codificador e essas coisas no ffmpeg, mas não consigo obter a sintaxe correta.

A linha que estou tentando deve (sim, eu sei ... "deveria") pegar todas as imagens .JPG no diretório e codificá-las como "out.mp4". Mas se você olhar no fundo, o que eu recebo é um aviso para substituir GOPR3974.JPG - que é o segundo arquivo no diretório. Isto implica que, por algum motivo, não está globbing todos os arquivos corretamente ... Eu tentei aspas simples, aspas duplas, eu tentei

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

então tem que haver algo em algum lugar que funcione. Se for importante, isso está sendo executado em um ambiente cygwin usando o 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]
    
por ljwobker 08.11.2014 / 18:09

1 resposta

4

Método 1: Use padrões de sequência

O que você realmente precisa é disso, se sua primeira imagem for chamada GOPR0001.JPG :

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

Ou se a primeira imagem é chamada GOPR3973.JPG , você precisa dar ao ffmpeg o número inicial para procurar:

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

Método 2: Use padrões de globbing

Se a sua versão do ffmpeg tiver suporte para globbing (que o Windows não possui, eu acho), então você pode simplesmente fazer:

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

Isso é preferível se você não souber o número inicial ou simplesmente não se importar com o controle preciso.

Por que não funciona

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

Isso não funciona porque ele se expandirá para algo assim (supondo que sua primeira imagem seja chamada GOPR0001.JPG ):

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

Como o ffmpeg trata a última opção de argumento sem nome (ou seja, qualquer coisa sem um - ) como o nome do arquivo de saída, GOPR2.JPG seria a saída e nada até out.mp4 não será aplicado.

Algumas dicas

  • -pix_fmt yuv420p é necessário para converter do espaço de cores YUV 4: 2: 2 do JPEG para subamostragem 4: 2: 0. Caso contrário, alguns players (a maioria dos não baseados em FFmpeg) não poderão exibir o vídeo

  • Controle a qualidade definindo a opção -crf 23 e escolhendo algo entre 18 e 28, onde menor significa melhor qualidade.

  • Você pode querer definir o framerate de acordo com o qual os quadros de entrada (imagens) foram capturados. Faça isso executando ffmpeg.exe -framerate 30 -start_number … . Se você não especificar a taxa de quadros, o ffmpeg assumirá que seus quadros originais foram gravados em 25 Hz.

  • Leia a image2 demuxer parte do manual.

  • As aspas duplas sempre são boas para evitar a expansão de padrões de shell.

por 08.11.2014 / 18:14