Converter imagens RGB em vídeo sem perdas com avconv / ffmpeg

2

Estou tentando converter uma série de imagens PNG24 contendo uma animação de tela em um vídeo sem perdas, para que cada pixel seja reproduzido exatamente como no original. Mas o avconv (e o ffmpeg) produzem os mesmos resultados insatisfatórios, que parecem derivar de uma conversão colostral dando errado.

Esta é a versão do avconv que estou usando:

avconv version 0.8.6-4:0.8.6-0ubuntu0.12.04.1, Copyright (c) 2000-2013 the Libav developers
  built on Apr  2 2013 17:02:36 with gcc 4.6.3

Cada uma das imagens tem 1280 × 800 pixels de tamanho. Eles não contêm nenhum motivo fotográfico, mas padrões especialmente pontilhados.

Eu usei o codec qtrle porque aparentemente esse é um codec sem perdas que funciona muito bem como GIFs animados ou PNGs animados. No entanto, durante a conversão para vídeo, parece haver uma conversão de espaço de cor ("filtro") que está mexendo com os pixels.

Esta é a saída do avconv:

$ avconv -f image2 -r 30 -i frames.png/wth-%08d.png -vcodec qtrle -pix_fmt rgb24 -t 15 qtrle-30fps-rgb.mov
avconv version 0.8.6-4:0.8.6-0ubuntu0.12.04.1, Copyright (c) 2000-2013 the Libav developers
  built on Apr  2 2013 17:02:36 with gcc 4.6.3
Input #0, image2, from 'frames.png/wth-%08d.png':
  Duration: 00:11:17.96, start: 0.000000, bitrate: N/A
    Stream #0.0: Video: png, bgra, 1280x800, 30 fps, 30 tbr, 30 tbn, 30 tbc
File 'qtrle-30fps-rgb.mov' already exists. Overwrite ? [y/N] y
[buffer @ 0x740a00] w:1280 h:800 pixfmt:bgra
[avsink @ 0x742ac0] auto-inserting filter 'auto-inserted scaler 0' between the filter 'src' and the filter 'out'
[scale @ 0x743680] w:1280 h:800 fmt:bgra -> w:1280 h:800 fmt:rgb24 flags:0x4
Output #0, mov, to 'qtrle-30fps-rgb.mov':
  Metadata:
    encoder         : Lavf53.21.1
    Stream #0.0: Video: qtrle, rgb24, 1280x800, q=2-31, 200 kb/s, 30 tbn, 30 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (png -> qtrle)
Press ctrl-c to stop encoding
frame=  450 fps= 22 q=0.0 Lsize=  126056kB time=15.00 bitrate=68843.4kbits/s    
video:126052kB audio:0kB global headers:0kB muxing overhead 0.003441%

Este é um arquivo de imagem PNG original:

Estaéumacapturadeteladovídeoqueestásendoreproduzido:

Por favor, note que você precisa ver essas imagens em sua resolução original de 1280 × 800 para notar as diferenças.

Aqui está uma comparação lado-a-lado , com a imagem da esquerda sendo a original e a direita o resultado após a codificação do vídeo:

Existe alguma maneira de produzir um arquivo de vídeo perfeito, perfeito e sem perdas, de uma série de PNGs?

    
por despens 18.05.2013 / 17:36

2 respostas

2

Com a ajuda de um colaborador do ffmpeg, descobriu-se que tanto o ffmpeg quanto a libav criam arquivos QuickTime sem perda. O problema parece ser o driver da placa gráfica exibir os vídeos de forma errada (já que os players baseados em GStream e VLC os exibem de forma incorreta, no entanto, o VLC está exportando PNGs perfeitos de quadros de vídeo). Se você quiser verificar se um vídeo realmente contém os quadros, pixel por pixel, tente usar

$ ffmpeg -i input.png -vcodec qtrle out.mov

$ ffmpeg -i input.png -f framecrc -
$ ffmpeg -i out.mov -f framecrc -

Isso gerará checksums de dados de quadros.

Para uma comparação visual, converta o vídeo sem perda de volta para quadros únicos e compare-os.

    
por 21.05.2013 / 13:57
0

Eu postei uma longa resposta em: Como criar um AVI descomprimido a partir de uma série de milhares de imagens PNG usando o FFMPEG

vcodec libx264rgb com -preset ultrafast -qp 0 ou utvideo .

    
por 15.01.2015 / 08:51