FFMPEG slideshow de imagens - apenas um quadro mostrado

5

Eu sou um iniciante no ffmpeg.

Eu quero converter várias imagens em uma apresentação de slides e criei este comando:

ffmpeg -y -r 1/5 -i *.jpg -r 25 output.mp4

Bastante direto. No entanto, o vídeo parece ter apenas um quadro de comprimento (é muito rápido para reconhecer para mim)

Aqui está o Ouput do comando acima:

    ffmpeg version 0.8.9-4:0.8.9-0ubuntu0.12.04.1, Copyright (c) 2000-2013 the Libav developers
  built on Nov  9 2013 19:12:07 with gcc 4.6.3
*** THIS PROGRAM IS DEPRECATED ***
This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
Input #0, image2, from 'swirl3777.jpg':
  Duration: 00:00:05.00, start: 0.000000, bitrate: N/A
    Stream #0.0: Video: mjpeg, yuvj444p, 1600x1200 [PAR 72:72 DAR 4:3], 0.20 tbr, 0.20 tbn, 0.20 tbc
Incompatible pixel format 'yuvj444p' for codec 'mjpeg', auto-selecting format 'yuvj420p'
[buffer @ 0x86e2040] w:1600 h:1200 pixfmt:yuvj444p
[avsink @ 0x86e8920] auto-inserting filter 'auto-inserted scaler 0' between the filter 'src' and the filter 'out'
[scale @ 0x86e8d80] w:1600 h:1200 fmt:yuvj444p -> w:1600 h:1200 fmt:yuvj420p flags:0x4
Incompatible pixel format 'yuvj444p' for codec 'mjpeg', auto-selecting format 'yuvj420p'
[buffer @ 0x86e8c00] w:1600 h:1200 pixfmt:yuvj444p
[avsink @ 0x87159a0] auto-inserting filter 'auto-inserted scaler 0' between the filter 'src' and the filter 'out'
[scale @ 0x86f1860] w:1600 h:1200 fmt:yuvj444p -> w:1600 h:1200 fmt:yuvj420p flags:0x4
Incompatible pixel format 'yuvj444p' for codec 'mpeg4', auto-selecting format 'yuv420p'
[buffer @ 0x86f17c0] w:1600 h:1200 pixfmt:yuvj444p
[avsink @ 0x870f4a0] auto-inserting filter 'auto-inserted scaler 0' between the filter 'src' and the filter 'out'
[scale @ 0x8737e60] w:1600 h:1200 fmt:yuvj444p -> w:1600 h:1200 fmt:yuv420p flags:0x4
Output #0, image2, to 'swirl3786.jpg':
  Metadata:
    encoder         : Lavf53.21.1
    Stream #0.0: Video: mjpeg, yuvj420p, 1600x1200 [PAR 1:1 DAR 4:3], q=2-31, 200 kb/s, 90k tbn, 0.20 tbc
Output #1, image2, to 'swirl3787.jpg':
  Metadata:
    encoder         : Lavf53.21.1
    Stream #1.0: Video: mjpeg, yuvj420p, 1600x1200 [PAR 1:1 DAR 4:3], q=2-31, 200 kb/s, 90k tbn, 0.20 tbc
Output #2, mp4, to 'output.mp4':
  Metadata:
    encoder         : Lavf53.21.1
    Stream #2.0: Video: mpeg4, yuv420p, 1600x1200 [PAR 1:1 DAR 4:3], q=2-31, 200 kb/s, 25 tbn, 25 tbc
Stream mapping:
  Stream #0.0 -> #0.0
  Stream #0.0 -> #1.0
  Stream #0.0 -> #2.0
Press ctrl-c to stop encoding
frame=    1 fps=  0 q=10.2 Lq=10.2 q=9.5 size=      -0kB time=0.04 bitrate=  -4.4kbits/s    
video:584kB audio:0kB global headers:0kB muxing overhead -100.003680%

Eu também tentei avconv, mas é a mesma saída, até mesmo o mesmo tamanho de arquivo. Se eu alterar os valores -r para algo ridículo como 3434321, ele ainda terá o mesmo tamanho de arquivo. Se eu adicionar -b 512k oder -b 1024 ele ainda terá o mesmo tamanho de arquivo novamente ... Parece que as opções são ignoradas de alguma forma.

As três imagens na pasta são detectadas corretamente.

Existe algum problema com o formato de pixels incompatíveis?

Estou aqui no Ubuntu 12.04 ffmpeg versão 0.8.9-4: 0.8.9-0ubuntu0.12.04.1

Qualquer palpite, o que eu poderia ter feito de errado aqui? TIA

    
por los_shadows 08.02.2014 / 14:27

2 respostas

6

Glob

ffmpeg do FFmpeg suporta padrões de glob , para que seus arquivos de entrada possam ser nomeados como qualquer coisa contanto que eles estejam na ordem desejada:

ffmpeg -framerate 1/5 -pattern_type glob -i "*.jpg" -vf "fps=25,format=yuv420p" out.mp4

O Ubuntu usa avconv e o buggy, falso " ffmpeg " do Libav, um fork do FFmpeg, e estes não suportam padrões glob. Veja Quem pode me dizer a diferença e a relação entre ffmpeg, libav e avconv?

Obter ffmpeg

Para obter ffmpeg , você pode simplesmente baixar uma versão do Linux de ffmpeg ou seguir uma guia passo-a-passo para compilar ffmpeg .

Problemas potenciais

A primeira imagem é ignorada

Existem alguns problemas não resolvidos ou inconsistências envolvendo -r e o fps filtro de vídeo . Às vezes, a primeira imagem de entrada parece ser ignorada ou exibida apenas para um quadro. Você pode usar o filtro fps para evitar o problema de ignorar, conforme mostrado no exemplo acima. Veja os ingressos # 1578 e # 3164 para mais informações.

Última imagem é ignorada

Pode parecer que a última imagem é ignorada ou exibida para um quadro. Não encontrei uma solução elegante para esse comportamento, mas você pode simplesmente fazer uma cópia do último arquivo de imagem para compensar.

Ainda mais pulando

Se as imagens de entrada não tiverem o mesmo formato de pixel e / ou tamanho de quadro, ffmpeg poderá pular um número indeterminado de quadros. Certifique-se de que todas as imagens de entrada sejam semelhantes para evitar isso. Você pode ver a saída do console que mencionará qualquer diferença no arquivo de entrada.

O vídeo MP4 de saída não é reproduzido

Use um player menos ruim ou use o filtro format , conforme mostrado no meu exemplo, ou use a opção -pix_fmt yuv420p output. Caso contrário, ffmpeg tentará evitar ou minimizar a subamostragem de croma (dependendo da sua entrada, do codificador que você está usando, do seu ffmpeg version, e as opções de codificação que você usa), e embora isso possa ser bom em um sentido técnico, ele pode criar uma saída que não pode ser reproduzida por players não baseados no FFmpeg.

    
por 08.02.2014 / 22:21
0

Tente isto:

ffmpeg -y -f image2 -r 1/5 -i img%03d.jpg -pix_fmt yuv420p -r 25 output.mp4  

Os seus jpegs devem ser numerados sequencialmente no formato img001.jpg ... img009.jpg. O %03d significa uma sequência de 3 dígitos - 2 zeros à esquerda para começar. Se você tivesse img01.jpg para img 09.jpg você usaria img%02d.jpg . A sintaxe *.jpg não funcionará.

    
por 08.02.2014 / 15:46