web-dev-qa-db-ja.com

avconv / ffmpegを使用してRGB画像をロスレスビデオに変換する

画面アニメーションを含む一連のPNG24画像をロスレスビデオに変換して、すべてのピクセルが元のピクセルとまったく同じように再現されるようにしようとしています。しかし、avconv(およびffmpeg)はどちらも同じ、満足のいく結果を生成しません。これは、コロスペース変換がうまくいかないことに起因しているようです。

これは私が使用しているavconvのバージョンです:

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

各画像のサイズは1280×800ピクセルです。写真の動機は含まれていませんが、特別にディザリングされたパターンが含まれています。

qtrleコーデックを使用したのは、これがアニメーションGIFやアニメーションPNGと非常によく似たロスレスコーデックであるためです。ただし、ビデオへの変換中に、ピクセルを混乱させる色空間変換(「フィルター」)が発生するようです。

これは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%

これは元のPNG画像ファイルです:

enter image description here

これは再生中のビデオのスクリーンショットです:

Screenshot of the video being replayed

違いに気付くには、これらの画像を元の1280×800の解像度で表示する必要があることに注意してください。

これを並べて比較します、左側の画像が元の画像で、右側の画像がビデオエンコーディング後の結果です。

enter image description here

一連のPNGから真にロスレスでピクセルパーフェクトなビデオファイルを作成する方法はありますか?

2
despens

Ffmpegの寄稿者の助けを借りて、ffmpegとlibavの両方が完璧なロスレスQuicktimeファイルを作成することがわかりました。問題は、グラフィックカードドライバーがビデオを誤って表示していることのようです(GStreamベースのプレーヤーとVLCの両方が誤って表示しているためですが、VLCはビデオフレームの完全なPNGをエクスポートしています)。ビデオに実際にピクセルごとにフレームが含まれているかどうかを確認する場合は、

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

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

これにより、フレームデータのチェックサムが出力されます。

視覚的に比較するには、ロスレスビデオを単一フレームに変換して戻し、それらを比較します。

2
despens

私は長い答えを投稿しました: FFMPEGを使用して一連の数千のPNG画像から非圧縮AVIを作成する方法

vcodec libx264rgb-preset ultrafast -qp 0、またはutvideo

0
Peter Cordes