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

24

Eu 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 não entender a opção de linha de comando -i do ffmpeg, mas estou colidindo com 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 encontrará 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 motivos de clareza, estou no Mac OSX 10.8, ffmpeg versão 1.2.1, zsh 4.3.11

    
por nkint 29.10.2013 / 14:10

4 respostas

39

Sem mais opções, o image2 demuxer do ffmpeg irá procurar por uma sequência começando com 0. Ele também irá verificar em torno deste índice, com um intervalo padrão de 5 (é por isso que ele não reclama nenhum índice no intervalo 0-4). Por a documentação , você deve definir o número inicial se quiser começar com um índice arbitrário, como 837.

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

Espaço de cores 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 subamostragem ). O vídeo resultante pode não ser jogável em todos os jogadores, principalmente em qualquer coisa que não seja baseada no FFmpeg. Seu player mostraria apenas quadros negros ou possivelmente travaria. Para corrigir isso, mude 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 opção -crf . Consulte o guia de codificação x264 para obter mais informações.

Por que o * glob não funciona

Não use o * como uma opção de entrada. O shell irá expandi-lo para todos os arquivos no diretório atual antes de ffmpeg vê-lo, portanto, o comando se expandirá para ffmpeg -i file1 file2 … filen . Como todos os arquivos de entrada em ffmpeg precisam da opção -i , serão necessários file2 … filen como arquivos de saída e sobrescritos. Não é bom.

    
por 29.10.2013 / 18:31
23

A globalização pode ser ativada especificando a opção -pattern_type glob :

ffmpeg -pattern_type glob -i '*.png' -vcodec libx264 out.mp4
    
por 06.05.2014 / 11:10
7

Nota: Pattern globbing não funciona no Windows (e nunca pode ser devido a falta de suporte para globbing no libavfilter no Windows.) Então, se você está fazendo isso no Windows, você terá que renomear os arquivos para que eles re numerada sequencialmente e sem lacunas.

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

dir *.jpg | %{$x=0} {Rename-Item $_ -NewName “Base$x”; $x++ }
    
por 30.12.2014 / 17:35
4

melhor maneira de renomear com o PowerShell (preservar pedido):

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

Tags