はじめに
動画や音声を扱っていると、avc1.4D401E
や mp4a.40.2
などのコーデックを表す記述を目にします。
この投稿では RFC 6381 の枠組みと、筆者がよく扱う AVC1 (H.264) や AAC について簡単に整理します。
RFC 6381
MP4 や MPEG2-TS のような複数のコーデックを内包するデータにおいて、 MIME Type に加えて複数のコーデックやプロファイルを表す方法が RFC 6381 で規定されています。
コーデックは BNF (バッカスナウア記法)で次のように書かれています。(AVC1 と AAC の該当箇所を抜粋)
id-simple :=/ id-iso
id-encoded :=/ id-iso
id-iso := iso-gen / iso-mpega / iso-mpegv / iso-avc
iso-mpega := mp4a "." oti [ "." aud-oti ]
iso-avc := avc1 / avc2 / svc1 / mvc1 / mvc2 [ "." avcoti ]
mp4a := %x6d.70.34.61 ; 'mp4a'
oti := 2(DIGIT / "A" / "B" / "C" / "D" / "E" / "F")
; leading "0x" omitted
avc1 := %x61.76.63.31 ; 'avc1'
avcoti := 6(DIGIT / "A" / "B" / "C" / "D" / "E" / "F")
; leading "0x" omitted
aud-oti := 1*DIGIT
avc1
や mp4a
の後にはピリオドで区切られて OTI (Object Type Indication) が続きます。
AVC1 なら avc1.
に続いて 16 進 6 桁で Profile と Level が書かれます。
MPEG-4 Audio なら aac.
に続いて oti
と aud-oti
が続きます。
OTI の具体的な値については後述します。
RFC 6381 にはコーデックに加えてプロファイルについても書かれています。プロファイルというのは isom
や mp41
などのことです。 MP4 のブランドに相当するものだと思いますが、筆者はまだあまり詳しくないので機会があれば改めて書きます。
OTI に入る値
OTI に入る値は例えば Codecs in common media types - Web media technologies | MDN の説明が参考になります。
ここでは私がよく扱う AVC1 と AAC について簡潔にまとめます。
AVC1 (H.264)
極めてよく使われている動画コーデックである AVC1 は MPEG-4 AVC (簡易的には単に「AVC」)あるいは H.264 と表記される場合がありますが、複数の標準化団体による呼び方の都合によるもので技術的には同じものを指しています。
RFC 6381 では avc1
という表記を用いるので、ここでは AVC1 と呼ぶことにします。
OTI の最初の 2 桁はプロファイルを表し、よく見かけるものだと
- 42 - Baseline Profile
- 4D - Main Profile
- 64 - High Profile
があります。
中央の 2 桁は互換性のあるプロファイルを表し、上位ビットから順に Baseline, Main, Extended Profile を指しています。
例えば C0 (= 80 | 40)
なら Baseline + Main となります。
Main Profile であれば 通常は avc1.4D40xx
になります。
Baseline Profile の場合に avc1.42C0xx
は Constrained Baseline と呼ばれるものを指し、それ以外の場合は avc1.42E0xx
となります。
最後の 2 桁が Level を表しています。
例えば 1F
なら 10 進に変換すると 31
となり、間にピリオドを打った 3.1
が H.264 で定義されている Level になります。
例えば avc1.42C00D
の場合、
- Profile - Constrained Baseline
- Profile Compatibility - Baseline + Main
- Level - 1.3
を表します。
なお、 16 進数に使うアルファベットが小文字で書かれているケースもしばしば見かけます。それらを読み取るプログラムを書く場合、各言語の標準ライブラリを使えば通常は問題無いと思います。
MPEG-4 AAC
MPEG-4 AAC なら OTI は 40 (16進数)です。
AC-LC なら mp4a.40.2
, HE-AAC なら mp4a.40.5
や mp4a.40.29
などとなります。
MP4 について
筆者は MP4 のボックスから値を取り出して RFC 6381 を書き出す実装をしたことがあるので、表記そのものの話とは違いますが最後に少し触れておきます。
AVC1 については ISO/IEC 14496-15 の中で AVCDecoderConfigurationRecord が定義されています。その要素のうち以下の 3 つをこの順序通りに 16 進数で記述すれば OTI になります。
unsigned int(8) AVCProfileIndication;
unsigned int(8) profile_compatibility;
unsigned int(8) AVCLevelIndication;
これは例えば avcC ボックスの中から取り出すことができます。
オーディオについては esds ボックス (ISO/IEC 14496-14 ) の値でコーデックを判別できます。
esds ボックスの中から DecoderConfigDescriptor (ISO/IEC 14496-1) を取り出すと objectTypeIndication があり、その値が 0x40 であれば AAC と判断できます。
さらに AAC-LC かどうかは DecoderSpecificInfo を取り出すことでわかります。
この辺りの実装は abema/go-mp4 で公開しています。