2020/06/28

SVT-AV1なるものがあるらしい

もはやh264は軽いし、h265もそこまで重くない時代になりました。
が、h265は特許を主張する輩が沢山いるせいで普及せず、ロイヤリティーフリーを標榜するAV1(AOMedia Video 1)が主流になりそうなニュースが流れてきてしばらくたちます。
(つい最近ロイヤリティーフリーを破るようなニュースも出てきた気がしますが)
そのせいか、h265をブラウザから直接再生はしてくれないのでなんだかな、と思っていた今日この頃。

エンコーダが途方もなく遅い、という話を聞いていたのでとりあえずx264/x265で続けているのですが、
AV1エンコーダーの速度と品質の比較 - ffmpeg(libaom) vs SVT-AV1
というのを見て、SVT-AV1は意外と実用になるのでは?という気になったので試してみたお話。

AV1のオフィシャルはlibaomらしいのですが、intelが頑張ってXeon最適化したS/Wエンコードするプログラムを作っているようで、それがSVT-AV1(Scalable Video Technology for AV1)だそうな。
当然ryzenでも動きます。マルチスレッド最適化されていますし。



■とりあえずエンコーダをコンパイルする
https://github.com/OpenVisualCloud/SVT-AV1
の通りにやるだけ。リンクとかもすべて書いてありますので、下記にやることだけ書きます。
・VS2017/2019を入れる
・CMakeをインストールする
・yasmを拾ってきて、名前はyasm.exeにして、パスを通す
・gitのソースを拾ってきて解凍する
・build.batが中に入ってるので、コマンドプロンプトから build 2019 とか打って.slnを作る
・VS2019とかで.slnを開いてall buildする(当然ながらreleaseのほうが速いバイナリが出来上がります)

■エンコード結果
以下、特に書いてない場合は環境はRyzen3700X + DDR4-3200 32G
コマンドは
%avs2pipemod% -y4mp CCS2_PR.avs | %AV1ENC% -i stdin -w 1920 -h 1080 -b output.ivf --rc 0 -q 30 --preset 5
とかそんな感じ、ソースはアニメです

-------------------------------------------
SVT [version]:  SVT-AV1 Encoder Lib v0.8.3
SVT [build]  :  Visual Studio 2019 64 bit
LIB Build date: Jun 28 2020 19:47:16
-------------------------------------------
Number of logical cores available: 16
Number of PPCS 88
[asm level on system : up to avx2]
[asm level selected : up to avx2]
-------------------------------------------
SVT [config]: Main Profile      Tier (auto)     Level (auto)
SVT [config]: EncoderMode                                                       : 5
SVT [config]: EncoderBitDepth / EncoderColorFormat / CompressedTenBitFormat     : 8 / 1 / 0
SVT [config]: SourceWidth / SourceHeight                                        : 1920 / 1080
SVT [config]: Fps_Numerator / Fps_Denominator / Gop Size / IntraRefreshType     : 24000 / 1001 / 16 / 1
SVT [config]: HierarchicalLevels  / PredStructure               : 4 / 2
SVT [config]: BRC Mode / QP  / LookaheadDistance / SceneChange                  : CQP / 30 / 33 / 0
-------------------------------------------
Encoding      2000
Average System Encoding Speed:        3.69
     2763avs2pipemod[info]: finished, wrote 2868 frames [100%].
avs2pipemod[info]: total elapsed time is 740.080 sec.
     2868
SUMMARY --------------------------------- Channel 1  --------------------------------
Total Frames            Frame Rate              Byte Count              Bitrate
        2868            23.98 fps                 32193635              2153.07 kbps


Channel 1
Average Speed:          3.813 fps
Total Encoding Time:    752250 ms
Total Execution Time:   753210 ms
Average Latency:        24183 ms
Max Latency:            35652 ms
Encoder finished

4fps出るなら、まぁ耐えられなくもない。(昔8fpsぐらいでエンコードしてた時期もあるので)
--preset 1は試してみたが遅すぎて途中で止めた・・・0.5fpsぐらい?

3900X + DDR4-3000 32Gでやると、ちょうど1.5倍になって、5.517fps
i7-4790K+DDR3 16Gでは1.547fps・・・これは耐えられませんね。
これでブラウザから直接再生できる動画が出来上がります。
・・・が、preset 5ではエンコードに6~7倍ぐらいかけて、圧縮率はHEVCに対して10%増しぐらい?

■というわけで自分にとってちょうどよい設定を探す
VMAF=97ぐらいになるようにサンプル動画をエンコードした結果は、

VMAF       kbps            使ったコマンド
97.300600 2304.00 kb/s x265 --crf 20 --preset medium --tune animation --profile main10
97.180957 2346.04 kb/s x265 --crf 20 --preset medium --tune animation --profile main
97.542126 3364.44 kb/s x264 --crf 20 --preset slow --tune animation --level 4.2
97.1328    2153.07 kbps SvtAv1EncApp -w 1920 -h 1080 --rc 0 --preset 5 -q 30

VMAF97近辺でオプションを変えた時の速度と品質は
97.135918  3.813 fps   2153.42 kbps   --preset 5 -q 30
97.216543  7.008 fps    2261.44 kbps    --preset 6 -q 30
97.214465  7.421 fps    2267.62 kbps    --preset 7 -q 30
96.884950 14.695 fps   2297.51 kbps    --preset 8 -q 30
97.123386 14.259 fps    2559.85 kbps    --preset 8 -q 28
97.453689 13.889 fps   3093.95 kbps    --preset 8 -q 25
になっているので、配信インフラなどが関係ない場合はpreset8とかのほうが良いのかも?

VMAFはいくつぐらいが良いのかわかりませんが、いろいろ試して見た感じq40=VMAF94.6が僕の感覚ではギリアウトなぐらいの画質なので、最低95以上、欲を言えば96~7ほしいですね。
ということはやっぱりq30なのか。
ちなみにブロックノイズスレッシュは93らしい。
ただ、q50でも見れないわけではなく、粗が目立つ、といった感じなのでFHDで1Mbpsを切ってもこれぐらいの画質が出せるのか、というのが驚きです。(HEVCとかもかもしれませんが)
最初から高解像度を想定して破綻しないアルゴリズムを作るとこうなるんですね。
97.453689    13.889 fps    3093.95 kbps    --preset 8 -q 25
97.123386    14.259 fps    2559.85 kbps    --preset 8 -q 28
96.884950    14.695 fps    2297.51 kbps    --preset 8 -q 30   
95.979471    15.137 fps    1723.76 kbps    --preset 8 -q 35
94.633790    15.510 fps    1324.21 kbps    --preset 8 -q 40
92.748147    15.868 fps    1046.35 kbps    --preset 8 -q 45
90.069641    16.279 fps     823.16 kbps    --preset 8 -q 50

■結論
エンコード速度を考えると家庭用ではまだh265やVP9に分があるようです。
というか高画質というよりようつべのような大規模配信のために少しでも高圧縮率を目指してプロセッサパワーをぶん回す感じなので、今までとはコンセプトが違ってきているのでしょう。
先のブログでも言っているように、今後の規格は演算コストと配信コストのバランスをとっていくのでしょうね。

HEVCと同じような圧縮率になりますが、--preset 8、-q 30とかで、ブラウザから直接再生できる動画を作る、という為に使うにはよいと思います。

僕のイメージ
MPEG2:DVDというメディア用 SDであれば画質はこれで十分
AVC(h264):携帯配信・BD向け FHDでも高画質・円盤に入る容量に
HEVC(h265):AVCの正統進化
VP9:知らん
AV1:配信業者向け?

テストは2minぐらいのでやってて問題ないな、とか思ってたのですが、30min番組をエンコードしてみたら、途中でavs2pipeが落ちて終わる・・・(メモリが足りないからどかされたんでしょう)
最初は4GBぐらいなのにどんどん増えていくのっておかしくね?
とか思ってたのですが、どうやら違うみたい

パイプでavs2pipemodからstdinを介してデータを渡していたのですが、フレーム数を数え間違えているのか先にavs2pipeが終了してもSVT-AV1は待ち受けのまま残っている、というのが正しいようです。
(それでもしばらく・・とはいっても実エンコード時間の3倍ぐらい経過した後にちゃんと終了するのが解せませんし、2minほどの時には問題なかったのも解せません)
というわけで、-n 0を追加したらちゃんとavs2pipeと一緒に終わるようになりました。

これでひとまずAV1エンコード環境も整いました。
・・・そういえばエンコードに向いていそうなRyzen3が出るらしいですね?(w

0 件のコメント:

コメントを投稿