色々調べたのでまとめておこうと思います。
AV1の概要についてはWikipediaあたりが丁度いいと思います。
個人的に注目したのはGoogle・Microsoft・ Mozilla・Appleがメンバーに入っているため、
多くのブラウザで対応されることが期待できそうというところです。
(SafariがVP9に対応してくれればそれでいいのですが・・・)
既に実装も進んでおり、Firefox Nightlyでは再生もサポートされているということだったので
エンコードと再生を試してみました。
エンコードにはリファレンスのエンコーダを使用します。
AV1のGitはこちら。
https://aomedia.googlesource.com/aom
AV1は現在も絶賛開発中となっており
仕様の確定が2017年末予定 → 2018年初め予定 → 現在も未確定という状況のようです。
よって、デコーダのバージョンとエンコーダのバージョンを合わせておかないと「再生出来ねぇ!」という状況になります。
そこでまずはFirefox Nightlyで使用されているデコーダのバージョンを調べます。
Firefoxに使用されているデコーダのバージョンの確認方法は以下のページにあります。
DASH playback of AV1 video in Firefox - Mozilla Hacks - the Web developer blog
「av1.experimental.<aomのコミットハッシュ>」をMediaSource.isTypeSupportedに入れて通ったらそのバージョンということです。
MediaSource.isTypeSupported('av1.experimental.e87fb2378f01103d5d6e477a4ef6892dc714e614');
aomのlogからコミットハッシュのリストを取ってきて一致するか調べて行けばどれかが当たります。
デコーダのバージョンが分かったら同じバージョンのソースを取得しビルドします。
ビルドの方法はREADMEに丁寧に書いてあるので基本はその通りにやればよいです。
補足として私がWindows上でビルドした時のメモも記載しておきます。
- Visual Studio 2017
- C++開発を追加する
- CMake version 3.5 or higher.
- CMakeは手動で叩くのでPATHを通すとかは必要ではない
- Git
- Makeの中でチェックしてるっぽいけど必須かはわからない
- ソースも落とせるのでとりあえず入れておけばよいだろう
- Gitクライアントなら何でも良さそうだがGit for windowsで動作を確認
- Perl
- Active Perlで大丈夫
- 特に追加のPPMとかは要らない
- Yasm
- Visual Studioと連携出来るっぽいvsyasmというのもあるけど普通のyasmの方でよい
- Make中に参照されているのでPATHを通しておく必要がある
- VSの再頒布可能パッケージが必要(どのバージョンかは忘れた)
CMakeのオプションが重要です。
cmake -G "Visual Studio 15 2017 Win64" -DCONFIG_CDEF_SINGLEPASS=1 -DCONFIG_UNIT_TESTS=0 path/to/aom
Visual Studio 2017用のファイルを作成するオプション。
-G "Visual Studio 15 2017 Win64"
「Win64」は64bitアプリをビルドする設定。
エンコーダはかなりメモリを食って普通に2GBを突破したりするので64bitで作るべきです。
Firefoxが追加しているオプション。
-DCONFIG_CDEF_SINGLEPASS=1
デフォルトはOFFですがFirefoxがONでビルドしているので合わせてONにします。
この設定は最新のバージョンには存在しません。(OFF時の実装が削除され、標準でONの動作となる)
テストを省略するオプション。
-DCONFIG_UNIT_TESTS=0
ちょっと使ってみるだけなので外しました。
ONにするとPythonを要求されて面倒なので・・・。
Makeが済むとVisual Studio用のファイルが生成されるので、ソリューションファイルを開けばビルドできます。
特に何も無ければビルドが成功してライブラリや実行ファイルが出力されるはずです。
エンコーダは aomenc.exe です。
割と作るのが面倒なのでビルドしたエンコーダも置いておきます。
私がビルドしたバイナリを信用できる人はお使いください。
あとこれを使って何が起きても私は知らん。
aomenc (for Firefox Nightly 61.0a1)
エンコーダが準備できたので今回は以下のようにエンコードしました。
aomenc.exe ^ --verbose ^ --psnr ^ --cpu-used=8 ^ --threads=4 ^ --tile-columns=2 ^ --passes=2 ^ --input-bit-depth=8 ^ --webm ^ --codec=av1 ^ --profile=0 ^ --end-usage=cq ^ --cq-level=32 ^ --target-bitrate=2048 ^ --bit-depth=8 ^ --color-space=bt709 ^ --output=output.webm ^ input.y4m
オプションについては別にまとめたので細かいことが知りたければ参照してください。
(ただし最新バージョンのオプションを元に書いたのでe87fb2378f01103d5d6e477a4ef6892dc714e614とは微妙に使えるオプションが違います)
ソースの映像はカスタムオーダーメイド3D2をキャプチャしてきて、
データ的には i420 960 * 540 30fps 総フレーム数4916となっています。
これをCore i7 3770でエンコードしたところ丁度5時間かかりました。
ただ、CPUを使い切ってくれないのでマルチスレッドがイマイチのようです。
VP9のソースと比較してみましたが、そもそもVP9もあまりマルチスレッド化をしていないようなので
処理内容的に向かなくて出来ないのかもしれません。
エンコードもアレですが、デコードもかなり遅いです。
最初は i444 1920 * 1080 60fps でエンコードしていたのですが、
再生してみるとデコード処理が間に合わないので
解像度とかFPSとかビットレートとかを下げて行って上記の内容になりました。
Core i7 3770ではデコード出来ていますがCPUによってはデコード出来ないかもしれません。
Firefoxはデコードが間に合わない場合次にデコードが間に合うフレームまで映像がストップするようです。
エンコードが遅いのは時間をかければなんとかならなくもないですが、
デコードが間に合わないとなると実用は無理ではないかと思います。
Gitのlogを見ているとSIMDで頑張って最適化しているようですが
SIMDとマルチスレッドでガリガリにチューニングしてどこまで行けるか。
さすがにハードウェアでのサポートが必須と言えるレベルではないかと思います。
ただ、ここから仕様を固めてハードウェアを設計してとなるとだいぶ未来の話になりそうです。
エンコードしたものはこちらになります。(45,290,322 Byte)
バージョンの合うデコーダでCPUパワーがあれば再生出来ます。
(あと、about:configでmedia.av1.enabledをtrueにする必要があります。)
あと音声をmuxしようとするとffmpegでもmkvtoolnixでも
「AV1とかWebmの仕様にはない!」とか怒られて入れられないので
結局libwebmのサンプルを元に簡単なプログラムを書いてmuxしました。
一応これも置いておきます。
例によってこれを使って何が起きても私は知らない。
webmmuxer
WebMはMatroskaのサブセットなのでMatroskaとして作って
拡張子をwebmに変えてFirefoxに突っ込んだらそこはかとなく動いたのでそれでもいいと思います。
この辺りの整備もまだまだこれからというところでしょうか。
FFmpegのアップデートがあって、aomについてちょっと検索したらここにたどり着きました。
貴バイナリ拝借して、avs2pipemodからaomencに渡したのですが、どの程度が重くてどの程度が軽いのかわからないまま適当にコマンド叩いた結果、2pass目の速度的には3.○○fpm!?で、結局aomencを中断し、バイナリとバッチの動作確認でいったん終了です。
(もはやfpsですらなく、2pass目起動直後は画面フリーズみたいになりコマンド間違っているのかと思ってバッチファイル中断しまくっていた。)
テストを古いノートPCで走らせたのもマズかったし、私も知識増やさないといけないし、aomもまだまだ色々と改良の余地が多そうですね、今後に期待。
私以外にも検索の結果で此処を訪問する方がいそうなので、私のコマンドもとりあえず残します。(問題あれば削除してください)
firstpassop=--passes=2 --pass=1 --cpu-used=4 --threads=4 --width=1024 --height=576 --fps=30000/1001 --auto-alt-ref=1 --end-usage=vbr --bias-pct=100 --target-bitrate=1200 --webm --kf-max-dist=300 --lag-in-frames=15 --aq-mode=2 --sb-size=dynamic
secondpassop=--passes=2 --pass=2 --cpu-used=4 --threads=4 --width=1024 --height=576 --fps=30000/1001 --auto-alt-ref=1 --end-usage=vbr --bias-pct=100 --target-bitrate=1200 --webm --kf-max-dist=300 --lag-in-frames=15 --aq-mode=2 --sb-size=dynamic
(avs2pipemod1.1.1はたぶん問題なく動いてた。)
%pipemod% %y4mop% %inavs% | %av1_path% %firstpassop% --fpf=%fpffile% --output=%outav1% -
%pipemod% %y4mop% %inavs% | %av1_path% %secondpassop% --fpf=%fpffile% --output=%outav1% -
今はi7-6700機でx265エンコがほとんどで、x265の2pass平均で19fps位(エンコ後QP平均は25~29位で大体落ち着く、オプション的にはaomと似たことやらせていると思っている)状況で、どんな程度が見たかったのですが、
バッチ走り終わるまで待てないほど遅くて、今のままだと選択肢に入れられないわ、という第一印象になってしまいました。