まず自社製品の WebRTC SFU で扱ってる映像コーデックは VP8 と VP9 (以降は 2つ合わせて VPX とする) 、そして H.264 の 3 つ。音声コーデックは Opus のみ。
もともと WebRTC の世界では H.264 は後から出てきたコーデックということもあり VPX がメインだった。そこで VPX と Opus を組み合わせる場合は WebM がデファクトとなる。実際ブラウザが持っている MediaRecorder API も最初は WebM のみで、後から MP4 に対応した。
そのため自社製品で音声と映像を保存するコンテナとして WebM を採用したのだが、どうやら流れは MP4 にあるらしい。
Chrome での AV1 は MP4 (ISOBMFF) でのみ再生できるようだし、 WebM は Google 独自ということもあり、このままおそらく MP4 にながれてきには統一されていくのだろう。
当たり前だが仕様もきっちり公開されている。
Google の Opus も MP4 に対応してしまったので、やらざるを得ない。
ちなみに VP9 は結構前に MP4 対応している。
ということで、時代に追いつくためにも WebM から MP4 への移行準備として Erlang/OTP で MP4 ライブラリを実装していくことにした。
WebRTC において録画周りは実はかなり複雑ということもあり、自前でライブラリを作っておかないとなにか起きたときに問題が起きるというのもある。
とりあえず社員に AV1/Opus な MP4 ファイルを作って貰った。とりあえずパースをし、その後、組み立て直して同じバイナリになることをまでを目的として進めていくことにする。
MP4 は思っている以上に情報が少ない印象がある。ISO の資料を見ろということなんだろうと思って入る。ただ日本語でまとめてあった資料がとても良かったので紹介しておく。
とてもわかり易くまとまっていて素晴らしかった。作者の uupaa さん感謝したい。
Chromium の実装も当たり前だがとても参考になる。
formats/mp4/box_definitions.cc — chromium/src/media — Git at Google https://chromium.googlesource.com/chromium/src/media/+/master/formats/mp4/box_definitions.cc