H264|AVC Reference Code


映像圧縮技術 H264| AVC のReference Codeで、エンコードをしてみます。

Refernceo Codeは、H264|AVCの規格を作った団体が作ったエンコーダ/デコーダになります。

ソフトウェアは、以下のサイトで入手可能です。jm19.0.zip をダウンロードします。

JM

ダウンロードしたファイルを解凍する。

cd JM

ビルドを行います。

make


binディレクトリに、アプリケーションができあがります。

ls ./bin

lencod.exe ldecod.exe rtpdump.exe rtp_loss.exe


次にエンコードするための、データを用意する。

https://media.xiph.org/video/derf/

のサイトのforemanのCIFのデータを使用する。

https://media.xiph.org/video/derf/y4m/foreman_cif.y4m





エンコーダが読み取れるデータ形式のyuv420pの形式で変更する。ffmpegを使用する。

./ffmpeg -i foreman_cif.y4m -f rawvideo -pix_fmt yuv420p -r 29.97 foreman_cif.yuv


できたforeman_cif.yuvをエンコードする。

encoderの設定をするために、binディレクトリの下にある。encoder.cfgファイルを変更します。
InputFileとFramesToBeEncodedとSourceWidth、SourceHeightを変更します。

InputFile             = "foreman_cif.yuv"       # Input sequence
FramesToBeEncoded     = 300    # Number of frames to be coded 
SourceWidth           = 352    # Source frame width
SourceHeight          = 288    # Source frame height


でエンコーダを実行します。

./lencod.exe


結果、test.264としてH264、AVCのファイルが生成されました。

次にデコードを行います。デコードはデフォルトで、test.264をデコードするようになっていますので、ldecode.exeを実行すると、デコードされます。


./ldecod.exe


デコードのパラメータは、decode.cfgに書かれています。デコードは300フレームだと1秒程度で終わります。
デコードした結果は、test_dec.yuvとして生成される。画質の評価は、ffmpegを使用する。エンコード前の画像とエンコード後の画像をPSNRを測定する。


./ffmpeg -f rawvideo -vcodec rawvideo -s 352x288 -pix_fmt yuv420p -i foreman_cif.yuv -f rawvideo -vcodec rawvideo -s 352x288 -pix_fmt yuv420p -i test_dec.yuv -filter_complex psnr -an -f null -


PSNRの結果になります。PSNRは数字が大きい方が画像が良いです。36ぐらいであればほぼ圧縮したことに気づかないレベルなのではないでしょうか。

PSNR y:36.077088 u:40.531662 v:41.980301 average:37.216513 min:34.622518 max:40.43020


ファイルサイズは、45619200 byte → 342772 byteと大幅に削減されています。

1枚目だけ、画像を確認します。

オリジナル画像

H264|AVC エンコード後の画像

若干圧縮されているのがわかりそうです。

自分でビルドしたlencod.exeldecod.exeを添付します。Linux上で動作すると思います。





コメント