FFMpeg converte imagens jpeg em video

4

Estou tentando tirar um conjunto de imagens tiradas em intervalos de 1 segundo para formar um vídeo timelapse. Eu percebi que isso seria fácil com o ffmpeg, mas estou com erros enigmáticos.

Todas as imagens são yup420 jpegs, tiradas de uma câmera android. Eles são salvos como jpegs individuais em uma pasta, são todos de tamanho e formatação idênticos. Eles são nomeados como uma sequência de nomes de 7 dígitos, iniciando em zero (como "0000000.jpg" a "0001000.jpg", por exemplo).

Esta é minha string (nomes de pastas redigidos para maior clareza):

avconv -r 1 -f image2 -i %07d.jpg -vcodec libx264 -crf 18 -preset slower video.mp4

Parece ótimo, eu vejo muitos posts de pessoas que dizem que funciona para eles.

No entanto ffmpeg me dá isso (negrito indica erro)

ffmpeg version 0.8.5-6:0.8.5-1, Copyright (c) 2000-2012 the Libav developers
  built on Jan 13 2013 12:05:48 with gcc 4.7.2
*** THIS PROGRAM IS DEPRECATED ***
This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
[mjpeg @ 0x233aea0] overread 8
Input #0, image2, from '%07d.jpg':
  Duration: 00:00:00.04, start: 0.000000, bitrate: N/A
    Stream #0.0: Video: mjpeg, yuvj420p, 640x480 [PAR 1:1 DAR 4:3], 25 tbr, 25 tbn, 25 tbc
File 'video.mp4' already exists. Overwrite ? [y/N] y
[buffer @ 0x233b340] w:640 h:480 pixfmt:yuvj420p
[libx264 @ 0x2339fa0] using SAR=1/1
[libx264 @ 0x2339fa0] using cpu capabilities: MMX2 SSE2Fast FastShuffle SSEMisalign LZCNT
[libx264 @ 0x2339fa0] profile Main, level 3.1
[libx264 @ 0x2339fa0] 264 - core 123 r2189 35cf912 - H.264/MPEG-4 AVC codec - Copyleft 2003-2012 - http://www.videolan.org/x264.html - options: cabac=1 ref=8 deblock=1:0:0 analyse=0x1:0x131 me=umh subme=9 psy=1 psy_rd=1.00:0.00 mixed_ref=0 me_range=16 chroma_me=1 trellis=2 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=0 b_adapt=2 b_bias=0 direct=3 weightb=0 open_gop=1 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=60 rc=crf mbtree=1 crf=18.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.25 aq=1:1.00
Output #0, mp4, to 'video.mp4':
  Metadata:
    encoder         : Lavf53.21.1
    Stream #0.0: Video: libx264, yuvj420p, 640x480 [PAR 1:1 DAR 4:3], q=-1--1, 25 tbn, 25 tbc
Stream mapping:
  Stream #0.0 -> #0.0
Press ctrl-c to stop encoding
[mjpeg @ 0x233aea0] overread 8
frame=    0 fps=  0 q=0.0 Lsize=       0kB time=10000000000.00 bitrate=   0.0kbits/s    
video:0kB audio:0kB global headers:0kB muxing overhead 610.000000%

As linhas de importação (que aparecem em vermelho) são aquelas que dizem " [mjpeg @ 0x233aea0] overread 8 ".

Isso me faz pensar que talvez esteja tentando ler as imagens como jpegs de movimento em vez de arquivos jpeg simples, e está falhando de alguma forma. Eu tentei com / sem "-f image2", com o mesmo resultado. E eu também tentei usar o avconv, com o mesmo resultado.

Devo observar que as imagens são válidas e, se eu as converter para * .png (um processo caro e demorado), tudo funcionará. Mas eu preferiria apenas usar os jpegs, sem uma conversão intermediária. Afinal, é para isso que o ffmpeg serve, transcodificando.

Alguém tem uma boa maneira de converter * .jpg em vídeo usando o ffmpeg?

    
por Knetic 02.03.2013 / 22:19

1 resposta

6

[mjpeg @ 0x233aea0] overread 8 é um erro que é lançado quando ffmpeg tenta ler uma imagem JPEG (ou um quadro de um fluxo MJPEG) bloco a bloco, mas ainda há bits restantes.

Nesse caso, mesmo que suas imagens possam estar aparecendo bem em outros espectadores, é algo que o FFmpeg não pode (ou não) manipular. Para corrigir isso, você precisa salvar novamente as imagens, como PNGs, como você tentou antes, ou como JPEGs. Você pode fazer esse tipo de conversão em lote com ImageMagick , por exemplo:

for f in *.JPG; do mogrify "$f"; done

Isso salvaria novamente os arquivos JPEG com o mesmo nome. Note que você perderá qualidade nesse processo, por isso não é ideal e eu iria com PNGs como intermediários como eles são lossless.

A propósito: é sempre uma boa idéia usar a versão mais recente do FFmpeg, que você pode baixar como uma versão estática (apenas baixe, extraia, use), ou compile você mesmo . Os pacotes que vêm com o Ubuntu estão sempre desatualizados, e - dependendo da sua versão do Ubuntu - nem mesmo o FFmpeg "real", mas o fork de Libav (que é bom de usar, mas deve ser sabe a diferença ).

Não se esqueça de que as imagens precisam ter nomes sequenciais quando você usa a sintaxe %07d.jpg para ffmpeg , sem perder números. Veja também a documentação no image2 muxer para mais opções.

    
por 02.03.2013 / 23:31