今日は、Media Foundation と流すデータについてお話ししたいと思います。主に音声データに関してお話ししたいと思います。(まあ自分に対するまとめでもあります。これを見れば、違うものを扱うときでもわかりやすいですし、記憶が簡単に呼び戻せますしね。)
概要
1. MP3 と MP3 headers
最初は昔から使われている MP3 のお話。まず、MP3 とは何なのか。
\MPEG Audio Layer-3/
です。とりあえず、Media Foundation のデコーダーのページを見てみましょう。
- ISO/IEC 11172-3 (MPEG-1 Audio) Layer 3
- ISO/IEC 13818-3 (MPEG-2 Audio) Layer 3, low sampling frequency extension
(Windows Media MP3 Decoder のページから)
ISO/IEC 11172-3 の PDF データなりを探してもよいのですが、いいサイトがありましたので、そちらの方を紹介させていただきます。そちらの方をサイトを参照すると、いろいろな形式について乗っていますが、補足についてもここで記述させていただきます。
注意すべき点は、MPEG-1 における MP3 と MPEG-2/2.5 における MP3 は少しヘッダーの中身が違う、ということです。ビットレートの値が違うぐらいだと思いますが、高ビットレートなら MPEG-1 のほうにしておけばいいんじゃないかと。
まず、私が見た結果のファイルなんですが、先頭からヘッダー情報があるとは限らないということです。ページでも紹介されているように ID3 タグという曲情報などが格納されたデータ領域があるのですが、この情報はファイルの先頭から始まる場合もある、ということを肝に銘じておいてください。「ヘッダーなんだから先頭からだろ jk」とか言ってしまえば終わりです。ちなみに、Media Foundation ではそのままのデータを食わせても正常に再生できました。
では、こちらのサイトをご覧になって、実装するなり MP3 について理解を深めるなりしてください。
「MP3オーディオ・ファイルを覗いてみる(基本型)」 http://norte.coron.jp/sound/mp3_01.html
どうやらいろいろ調べていると、生ものの AAC と Audio Data Transport Stream という 2 つの規格があるみたいです。一般的に日常で使われているものはたぶん ADTS 形式が多いと思います。では、ここでも Media Foundation のデコーダーのページを見てみましょう。
- MPEG-2 AAC Low Complexity (LC) profile (multichannel)
- MPEG-4 HE-AAC v1 (multichannel) with AAC-LC core
- MPEG-4 HE-AAC v2 (stereo) with AAC-LC core
AAC の Main には対応していないみたいです。iTunes が対応してないので、基本的に使われる場面が少なそうですけどね。
AAC に関しては特に補足説明もございません。ADTS のデータ自体、必要のないデータは無視して進めそうですし、そのあたりわかりませんけども。こちらのサイトを参照いただければいいかと。
「FAAD2を使ってAAC再生ソフトを作る(その1)」 (http://nanncyatte.blog52.fc2.com/blog-entry-26.html)
3. ADTS headers と AudioSpecificConfig
ADTS じゃない場合もあります、AudioSpecificConfig です。これに関してはまとめてある情報ってのがものすごく少ないと思います。とりあえず、いろいろ漁った結果出てきた資料をわかりやすい形でまとめてみたので、こちらを参照ください。
ADTS headers と違いますね。Media Foundation に食わせる場合は、これを情報源として、raw なデータを渡してやればうまくいくと思います(まだ実装完成していない)
総括
今回は、音声データの形式特集でした。音声データといっても、昔「音声の圧縮データだけ入ってるのかな? いやでもそれだと区切りわからないんじゃない? ストリーミングにするときどうやって分割してるんだろう… 音声途中から始まったらどうなるんだろう…」 みたいな、特にストリーミング時における謎が解決しました。こういう情報が含まれていたんですね。
次回は、映像 H.264 について扱う予定です。もっと多くの方が Media Foundation を使っていろいろなアプリ書いてほしいという思いです。Media Foundation と WinRT Api を使って独自プロトコルで映像配信! なんてことも夢ではないですよ。
それでは。