exits

勉強記録

ffmpeg4.0のAV1使ってみた

ffmpegの4.0が出たようです。

https://www.ffmpeg.org/index.html#pr4.0
f:id:yue82:20180421173951p:plain
最近話題のAV1さんがいますね。

というわけでちょっと使ってみました。

準備

Windowsでのビルドがめんどくさかったのでここ( Builds - Zeranoe FFmpeg )からビルド版をダウンロード。
f:id:yue82:20180421174730p:plain:w400

エンコードしてみた

$ ./bin/ffmpeg -r 24 -s 352x288 -i C:/cygwin/home/yue/data/yuv/cif/bus_cif.yuv -frames 15 -b:v 95k -preset slow -vcodec libaom-av1 -strict -2 C:/cygwin/home/yue/data/rd_seq/cif/av1/test.ivf
ffmpeg version N-90793-g30940be359 Copyright (c) 2000-2018 the FFmpeg developers
  built with gcc 7.3.0 (GCC)
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-bzlib --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth
  libavutil      56. 15.100 / 56. 15.100
  libavcodec     58. 19.100 / 58. 19.100
  libavformat    58. 13.100 / 58. 13.100
  libavdevice    58.  4.100 / 58.  4.100
  libavfilter     7. 18.100 /  7. 18.100
  libswscale      5.  2.100 /  5.  2.100
  libswresample   3.  2.100 /  3.  2.100
  libpostproc    55.  2.100 / 55.  2.100
[rawvideo @ 0011edc0] Estimating duration from bitrate, this may be inaccurate
Input #0, rawvideo, from 'C:/cygwin/home/yue/data/yuv/cif/bus_cif.yuv':
  Duration: 00:00:06.00, start: 0.000000, bitrate: 30412 kb/s
    Stream #0:0: Video: rawvideo (I420 / 0x30323449), yuv420p, 352x288, 30412 kb/s, 25 tbr, 25 tbn, 25 tbc
Codec AVOption preset (Configuration preset) specified for output file #0 (C:/cygwin/home/yue/data/rd_seq/cif/av1/test.ivf) has not been used for any stream. The most likely reason is either wrong type (e.g. a video option with no video streams) or that it is a private option of some encoder which was not actually used for any stream.
Stream mapping:
  Stream #0:0 -> #0:0 (rawvideo (native) -> av1 (libaom-av1))
Press [q] to stop, [?] for help
[libaom-av1 @ 03b35680] 0.1.0-9265-gff07a1210
Output #0, ivf, to 'C:/cygwin/home/yue/data/rd_seq/cif/av1/test.ivf':
  Metadata:
    encoder         : Lavf58.13.100
    Stream #0:0: Video: av1 (libaom-av1) (AV01 / 0x31305641), yuv420p, 352x288, q=-1--1, 95 kb/s, 24 fps, 24 tbn, 24 tbc
    Metadata:
      encoder         : Lavc58.19.100 libaom-av1
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
frame=   15 fps=0.1 q=-0.0 Lsize=      44kB time=00:00:00.62 bitrate= 576.5kbits/s speed=0.00485x
video:44kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.472898%

15frameでだいたい2分くらい。

ビットレート95kbps指定の結果を比較

ffplayで再生して見比べてみる。fpsを24としてエンコードしている。

コーデック AV1 (aom) h264(x264) h265(x265)
15フレームめ f:id:yue82:20180422024400p:plain:w200 f:id:yue82:20180422022049p:plain:w200 f:id:yue82:20180422022057p:plain:w200
指定ビットレート 95 kbps 95 kbps 95 kbps
ファイルサイズ 57.2 kB 11.3 kB 18.2 kB
実際のビットレート 732.16kbps 144.64kbps 232.96kbps

すごーいきれーい、だが、ファイルサイズがかなり違う。
指定ビットレートが同じはずなのに・・・どこかで設定ミスっているかもしれない。

実際のビットレートが似ている結果を比較

なんとなくファイルサイズの似たのを探すと、h265のビットレート760kbps指定のが近かったのでそちらと比べてみる。

コーデック AV1 (aom) h264(x264) h265(x265)
15フレームめ f:id:yue82:20180422024400p:plain:w200 f:id:yue82:20180422023504p:plain:w200 f:id:yue82:20180422023515p:plain:w200
指定ビットレート 95 kbps 760 kbps 760 kbps
ファイルサイズ 57.2 kB 72.2 kB 57.8 kB
実際のビットレート 732.16 kbps 924.16 kbps 739.84 kbps

h264よりはきれいだが、h265と比べると265のほうがきれいに見える・・気がする。

RD曲線引いてみた

PSNRで適当に2枚ほど。上と同じくcif15frame。
f:id:yue82:20180422024804p:plain:w300 f:id:yue82:20180422024807p:plain:w300

高ビットレートでぐんと伸びる傾向がある。
presetを変えてもほとんど変わっていないので、チューニングされてないということだろうか。(それで言うとx264もだけど)

エンコード時間測ってみた

f:id:yue82:20180422025220p:plain:w300 f:id:yue82:20180422025225p:plain:w300

😇


追記

ファイルサイズから実際のビットレートの計算をするのが間違えていた(bit/Byte)ので修正しました。

追記2

自分でビルドしてみた。

環境

  • ubuntu 16.04
  • gcc 5.4.0
  • cmake 3.5.1

aomのmake

$ git clone https://aomedia.googlesource.com/aom
$ cd aom
$ mkdir aom_build
$ cd aom_build
$ sudo apt-get install libwxbase3.0-dev libwxgtk3.0-dev
$ sudo apt-get install yasm
$ cmake ..
$ make

ffmpegにlibaomをつなげてmake

$ git clone https://git.ffmpeg.org/ffmpeg.git
$ git checkout remotes/origin/release/4.0
$ sudo cp aom_build/aom.pc /usr/local/lib/pkgconfig/
$ sudo cp aom_build/libaom.a /usr/local/lib/
$ ./configure --enable-version3 --enable-gpl --enable-libvmaf --enable-libx264 --enable-libx265 --enable-libvpx --enable-libaom --prefix=/usr/local --enable-nonfree --enable-static --disable-shared --extra-cflags="-I/usr/local/include -I/usr/include -I/path/to/aom" --extra-ldflags="-L/usr/local/lib" --enable-libfreetype
$ make

libaomはデコードに使うらしい (https://www.ffmpeg.org/general.html#Alliance-for-Open-Media-libaom)