概要
webrtcについて、いろいろ探っていたら目に止まったので、ちょっと動かしてみました。
https://aomedia.googlesource.com/
こいつですね。
今回つくったもの。
https://github.com/taktod/aomCheck
とりあえず動作するものが欲しいのでつくってみました。
プログラムは3つ
1つはopencvTest.c
これはaomでencode / decodeする前に必要なものがちゃんと揃ってるか確認する意味で作りました。
ffmpegの内臓コーデックである、avcodecでデコード
opencvの画像表示動作をつかって、デコードしたデータを表示
そのままコード書くと面倒なので、自作ライブラリのttLibCをつかって動作補助してます。
2つ目はencode.c
ffmpegのavcodecでデコード
aomをつかってav1のCodecとしてエンコード
適当なフォーマットがないので(*1)、4byte + frameのbinaryという形のbinファイルに保存
3つ目はdecode.c
encode.cでつくったbinファイルを読み込む
aomをつかってav1のCodecでデコード
opencvで画像を表示
という動作になってます。
テストした環境

こんな環境で実施してみました。
ffmpeg、opencvはbrewでインストール済み。
readmeにも書きましたがaomとttLibCはプロジェクトディレクトリ上に展開してコンパイルだけ実施しました。システムは汚さない、コレ大切
つくってみた感想
なんといってもlibvpxそっくり。
使い方がほぼ一緒でいけたので、楽でした。
いまのところ実験コードである、CONFIG_ANSを有効にしないと、encodeもdecodeもフリーズするみたいです。
encodeは確かに遅いですね。(*2)
ライブ系のサービスやってる人間としては、うわぁ・・・という感じでした。
data->cfg.rc_max_quantizer = 31;
data->cfg.rc_min_quantizer = 11;
data->cfg.g_timebase.num = 1;
data->cfg.g_timebase.den = 60;
data->cfg.rc_target_bitrate = 500; // 500kbps
data->cfg.g_pass = AOM_RC_ONE_PASS;
data->cfg.g_threads = 4;
res = aom_codec_enc_init(&data->codec, aom_codec_av1_cx(), &data->cfg, 0);
if(res != AOM_CODEC_OK) {
puts("filed to initialize aom. part2.");
return false;
}
aom_codec_control(&data->codec, AOME_SET_CPUUSED, 8);
一応マルチスレッドで作業させて、SET_CPUUSEDで処理を軽減してみましたが、速度でないですね。
これ、一応webrtcで利用するつもりなんですよね。たぶん。
decodeは、まぁそこそこの速度でますね。さすがにこのPCでHD画質の60fpsの再生やってみたら、うわぁ・・・な結果になりましたが
640x360程度、30fps程度なら、おぉ、やるじゃんという結果になりました。
メモ
*1: 適当なフォーマットがないと書きましたが、本来はwebm(av1 / opus)になるみたいです。
webmで保存してもよかったのですが、どのように保存するか調べるのも面倒だったし、つくっても今後仕様がかわりそうだったので、スルーしました。
単にdecode動作だけ抜き出してみたかったので、今回はtimestamp等も適当です。
*2: もうちょっとスペックの良いMacBookAirで、前日からこのコードで
big buck bunney(http://bbb3d.renderfarming.net/download.html)の
Standard 2D full HDの60fpsのデータを変換かけてますが、まだ終わらない。