Esclarecimento sobre a opção de entrada ffmpeg com arquivos de imagem como entrada

34

Tenho algumas imagens e gostaria de fazer um gif animado com ffmpeg. As imagens têm nomes como:

837_1.png
838_1.png
...

Estou tentando entender a opção de linha de comando -i do ffmpeg, mas estou travando contra alguns problemas.

Se eu não especificar nada, peça para substituir os arquivos:

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 eu tentar usar um dos formatos mais usados ​​(% d) na internet .. o ffmpeg não encontra os arquivos:

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

Então .. aqui está a pergunta, como usar a opção de linha de comando -i com ffmpg?

Por uma questão de clareza, estou no Mac OSX 10.8, ffmpeg versão 1.2.1, zsh 4.3.11

nkint
fonte

Respostas:

47

Sem outras opções, o image2desmuxer do ffmpeg procurará uma sequência começando com 0. Ele também verificará esse índice, com um intervalo padrão de 5 (é por isso que ele reclamará de nenhum índice no intervalo de 0 a 4). De acordo com a documentação , você deve definir o número inicial se desejar iniciar em um índice arbitrário, como 837.

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

Espaço de cor na conversão de PNG para H.264

Como os arquivos PNG usam o espaço de cores RGB para representar pixels, a conversão para H.264 acabaria sendo YUV 4: 4: 4 ( sem subamostra ). O vídeo resultante pode não ser reproduzido em todos os players, principalmente em itens que não sejam baseados no FFmpeg. Seu aparelho mostraria apenas molduras pretas ou possivelmente trava. Para corrigir isso, altere o formato do pixel para YUV 4: 2: 0:

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

Para controlar a qualidade, use a -crfopção Consulte o guia de codificação x264 para obter mais informações.

Por que a *glob não funciona

Não use o *como uma opção de entrada. O shell o expandirá para todos os arquivos no diretório atual antes de ffmpegvê-lo, portanto, o comando se expandirá para ffmpeg -i file1 file2 … filen. Como todos os arquivos de entrada ffmpegprecisam da -iopção, eles serão substituídos file2 … filencomo arquivos de saída. Não é bom.

slhck
fonte
resposta muito completa! e você também tem alguns conselhos sobre gif animado?
Nkint 29/10
Para GIFs animados, você deseja atualizar para o ffmpeg versão 2.0 e posterior, porque eles melhoraram muito a qualidade visual. A descarga página tem alguns links para estático constrói para OS X. Para ffmpeg mais velhos, ver: vídeo convertidos ffmpeg .flv para .gif com terrível qualidade
slhck
In fact, it not only checks +0..4 but also 8,16,32,64 etc. This is noticeable when using HTTP url's. However, image2 fails to recognize that 200 OK is the equivalent of "file found" so it doesn't stop searching.
MSalters
1
Estou recebendo a mesma coisa mesmo depois de tentar implementar suas sugestões. Meus arquivos são nomeados DSCxxxxx.jpgonde xxxxxestá um número de 5 dígitos começando com zero (observe que não tenho sublinhados). Ainda assim, depois de executar ffmpeg -r 30 -start_number 04606 -i DSC%d.jpg out.mp4, recebo o mesmo erro que no post original acima
Anonymous
@jphollowed Você colocou o padrão do nome do arquivo entre aspas?
slhck
29

O globbing pode ser ativado especificando a -pattern_type globopção:

ffmpeg -pattern_type glob -i '*.png' -vcodec libx264 out.mp4
yohanson
fonte
2
Muito melhor maneira :)
Gustav
3
Só isso funcionou para mim. Não há forma de obter este xxx%d.png, xxx%3d.png, 'xxx%d.png'ou 'xxx%3d.png'coisa de trabalho
yPhil
Eu recebo o mesmo erro depois de tentar o seguinte:[image2 @ 0x2552560] Could find no file with path '*.jpg' and index in the range 0-4 *.jpg: No such file or directory
Anônimo
O tipo de padrão 'glob' foi selecionado, mas o globbing não é suportado por esta compilação do libavformat [usando o Windows ffmpeg] [oof, deveria ter rolado uma resposta para baixo]
Katastic Voyage
7

Nota: O globbing de padrão não funciona no Windows (e talvez nunca seja devido à falta de suporte ao libavfilter no Windows.) Portanto, se você estiver fazendo isso no Windows, precisará renomear os arquivos para que sejam numerados sequencialmente e sem lacunas.

Você pode renomeá-los com uma simples linha de comando do Powershell:

dir *.jpg | %{$x=0} {Rename-Item $_ -NewName “Base$x”; $x++ }
Bill Westrup
fonte
Isso irá retornar file1.jpg file2.jpg... file10.jpgque se você classificar em ordem alfabética iria acabar file1.jpg, file10.jpg...file2.jpg
STIB
Isso não deveria ser Base $ x.jpg? Como está, o seu renomeou todo o meu e matou as extensões de arquivo.
Katastic Voyage
5

melhor maneira de renomear com o PowerShell (preservar a ordem):

dir *.jpg | %{$x=0} {Rename-Item $_ -NewName "Base$($x.tostring('000000')).jpg"; $x++ }
pBac
fonte
Será dirsempre voltar os arquivos em ordem alfabética? Seria mais seguro adicionar um sort-objectna mistura?
Stib