MP4 ライブラリ

V
V
Apr 30, 2019 · 4 min read

WebM で利用されている EBML のライブラリはあるのだが、MP4 向けのライブラリが無いため、作り始めた。

そもそもなぜ WebM はあるのに、MP4 はないのか、という話を書いておくことにする。

まず自社製品の 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 の資料を見ろということなんだろうと思って入る。ただ日本語でまとめてあった資料がとても良かったので紹介しておく。

とてもわかり易くまとまっていて素晴らしかった。作者の

さん感謝したい。

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

shiguredo

Medium is an open platform where 170 million readers come to find insightful and dynamic thinking. Here, expert and undiscovered voices alike dive into the heart of any topic and bring new ideas to the surface. Learn more

Follow the writers, publications, and topics that matter to you, and you’ll see them on your homepage and in your inbox. Explore

If you have a story to tell, knowledge to share, or a perspective to offer — welcome home. It’s easy and free to post your thinking on any topic. Write on Medium