2009.08.08
【AS3入門】続・読み込み可能なMP3ファイルのフォーマット(追検証とLAMEの仕様について)
以前、Embedタグで読み込めるMP3ファイルについての記事を書き、その中でいくつか疑問点があったのですが、それについて、馬鹿全さんがEmbedタグに関連した詳しい検証記事を書いてくれていてとても参考になったので、自分の環境でも改めて追検証しました。また、サンプリングレートが意図せず変わってしまった件についても調べ直しました。サンプリングレートが変わってしまった原因は、LAMEの仕様のようです。 ※このエントリーで使用しているLAMEのバージョンはLAME 3.98.2です。
前回の記事を振り返って
前回の記事で、問題点・疑問点だったところを振り返ると、
- Loaderクラスでは読み込み可能なのに、Embedタグでは埋め込めないMP3ファイルがあった
- 調べてみると、埋め込めるMP3ファイルのフォーマットには制限があることがわかった
- 原因はサンプリングレートだったが、なぜサンプリングレートが変わったのかがわからなかった
といった感じだったのですが、(1)と(2)について馬鹿全さんがEmbedタグに関する記事で詳しく検証してくれて、なんと(2)については参考にした読み込み可能なMP3ファイルフォーマットの一覧表に間違いがあることまでご指摘いただき、かなり自由なビットレートの値やビットレート方式のMP3ファイルが読み込み可能なことを教えていただきました。その教えていただいた情報をコピペするだけでは進歩がないのでw、今回は馬鹿全さんとほとんど同じ検証になりますが自分の環境でも追検証してみました。
また、前回MP3ファイルを作成した際に、なぜサンプリングレートが元のWAVファイルの「44,100 Hz」から違う数値に変わってしまったのかについても調べ直し、(3)の原因がわかったので記事にしておきます。
読み込み可能なMP3ファイルのフォーマット(馬鹿全さん調べ)
というわけで、馬鹿全さんが検証してくれた内容を元に前回の一覧表を修正してみると下記のようになります。前回の表との相違点を赤の太字にしてあります。
方式 読み込み可/不可 CBR(固定ビットレート) 可 ABR(平均ビットレート) 可 VBR(可変ビットレート) 可 FFS(フリーフォーマットストリーム) 不明
読み込めるサンプリングレート(単位:Hz) 44,100 22,050 11,025 馬鹿全 - AS3 での Embed の話
読み込めるビットレート(単位:kbps) 320 256 224 192 160 144 128 112 96 80 64 56 48 40 32 24 20 16 8
この検証により、ビットレートの値、方式ともにLAME(後述のMP3エンコーダー)でエンコード出来るすべてに対応していることがわかり、Embedタグで読み込む際に問題となるのはサンプリングレートだけではないか、と馬鹿全さんは結論づけています。
で、これだけでは馬鹿全さんの検証のコピペだけになってしまうので、自分の環境でも追検証してみました。
新たに加わった読み込み可能なビットレートの追検証
前述の一覧表で、読み込み可能であると判明して新たに加わった箇所(赤の太字)について、自分の環境でも読み込み可能であるかを追検証してみました。
| 新たに加わったビットレートの方式 | ABR(平均ビットレート) | VBR(可変ビットレート) |
|---|
| 新たに加わったビットレートの値 | 320 | 256 | 224 | 192 | 144 | 96 | 40 |
|---|
CBR方式で新たに加わったビットレートの値7種類と、ABR方式とVBR方式の計9種類のMP3ファイルを作成します。
さらに元ファイルのWAVファイルを効果音などに使われる1秒程度のものと、BGMなどに使われる5分以上あるものを用意し、それぞれに上記のフォーマットで作成したので全部で18種類のMP3ファイルを作成しました。
元ファイルのWAVファイルはどちらも、サンプリングレートが44100Hz、ビットレートが1411kbps、チャンネル数が2、コーデックがPCMのものを使用しました。MP3エンコードに使用しているLAMEのバージョンはLAME 3.98.2です。*1
rem こんな感じのバッチファイルで for %%A in (320 256 224 192 144 96 40) do for %%B in (a b) do lame -b %%A --resample 44.1 %%B.wav __%%B_cbr%%A.mp3 for %%B in (a b) do lame --abr 192 --resample 44.1 %%B.wav __%%B_abr.mp3 for %%B in (a b) do lame -V 2 --vbr-new --resample 44.1 %%B.wav __%%B_vbr.mp3
// こんな感じでEmbed [Embed(source = '/assets/__a_cbr320.mp3')] private const EmbedClassCBR_a320:Class; [Embed(source = '/assets/__b_cbr320.mp3')] private const EmbedClassCBR_b320:Class; [Embed(source = '/assets/__a_cbr256.mp3')] private const EmbedClassCBR_a256:Class; [Embed(source = '/assets/__b_cbr256.mp3')] private const EmbedClassCBR_b256:Class; [Embed(source = '/assets/__a_cbr224.mp3')] private const EmbedClassCBR_a224:Class; [Embed(source = '/assets/__b_cbr224.mp3')] private const EmbedClassCBR_b224:Class; [Embed(source = '/assets/__a_cbr192.mp3')] private const EmbedClassCBR_a192:Class; [Embed(source = '/assets/__b_cbr192.mp3')] private const EmbedClassCBR_b192:Class; [Embed(source = '/assets/__a_cbr144.mp3')] private const EmbedClassCBR_a144:Class; [Embed(source = '/assets/__b_cbr144.mp3')] private const EmbedClassCBR_b144:Class; [Embed(source = '/assets/__a_cbr96.mp3')] private const EmbedClassCBR_a96:Class; [Embed(source = '/assets/__b_cbr96.mp3')] private const EmbedClassCBR_b96:Class; [Embed(source = '/assets/__a_cbr40.mp3')] private const EmbedClassCBR_a40:Class; [Embed(source = '/assets/__b_cbr40.mp3')] private const EmbedClassCBR_b40:Class; [Embed(source = '/assets/__a_abr.mp3')] private const EmbedClassABR_a:Class; [Embed(source = '/assets/__b_abr.mp3')] private const EmbedClassABR_b:Class; [Embed(source = '/assets/__a_vbr.mp3')] private const EmbedClassVBR_a:Class; [Embed(source = '/assets/__b_vbr.mp3')] private const EmbedClassVBR_b:Class;
結果は馬鹿全さんの検証と同じくすべて再生でき、前回の表に載っていなかったビットレートの値も、不可となっていたABR・VBRのビットレート方式も使用可能だということがわかりました。
なぜサンプリングレートが「24,000Hz」になったのか?
これらの検証の結果、MP3ファイルをEmbedタグで使用する場合はサンプリングレートにだけ注意すれば良いことがわかりました。では、前回なぜサンプリングレートが元のWAVファイルの「44,100 Hz」から違う数値に変わってしまったのか? これについて調べてみました。
一番最初にこの記事を書いたときにエラーの原因となったMP3ファイルの作成元のWAVファイルと、今回改めて検証した際に使用した前述のa.wavのWAVファイルはまったく同じものです。このWAVファイルと、前述のBGM用のWAVファイルはどちらもサンプリングレートが「44,100Hz」です。
ということは、MP3ファイルに変換する際にサンプリングレートが変わってしまったことになります。そして検証した結果、どうやら原因はLAMEの仕様によるもののようです。以下は検証した内容。
rem サンプリングレートがどこで変わるかの検証用バッチファイル for %%A in (8 16 24 32 40 48 56 64 80 96 112 128 144 160 192 224 256 320) do for %%B in (a b) do lame -b %%A %%B.wav __cbr%%A_%%B.mp3 for %%A in (8 16 24 32 40 48 56 64 80 96 112 128 144 160 192 224 256 320) do for %%B in (a b) do lame --abr %%A %%B.wav __abr%%A_%%B.mp3 for %%A in (0 1 2 3 4 5 6 7 8 9 10) do for %%B in (a b) do lame -V %%A %%B.wav __vbr%%A_%%B.mp3
このバッチファイルは、馬鹿全さんの検証に使われたものをベースに、サンプリングレートの指定を削除して*2、2種類のWAVファイルからMP3ファイルを生成するように変更したものです。CBR、ABR、VBRで音質の段階を付けてエンコードするように指定してあります。
このバッチファイルから生成されたMP3ファイルの、各ビットレートまたはVBRオプション毎のサンプリングレートは以下のようになりました。
| 指定した ビットレート | CBR方式の サンプリングレート | ABR方式の サンプリングレート | 指定したLAMEのVBRオプション (カッコ内は目安となるkbps)*3 | VBR方式の サンプリングレート |
|---|---|---|---|---|
| 8 kbps | 8000 Hz | 8000 Hz | -V 10 (VBR 29kbps前後) | 8000 Hz |
| 16 kbps | 8000 Hz | 8000 Hz | -V 9 (VBR 66kbps前後) | 22050 Hz |
| 24 kbps | 8000 Hz | 8000 Hz | -V 8 (VBR 93kbps前後) | 32000 Hz |
| 32 kbps | 16000 Hz | 16000 Hz | -V 7 (VBR 104kbps前後) | 32000 Hz |
| 40 kbps | 16000 Hz | 16000 Hz | -V 6 (VBR 122kbps前後) | 44100 Hz |
| 48 kbps | 22050 Hz | 22050 Hz | -V 5 (VBR 135kbps前後) | 44100 Hz |
| 56 kbps | 24000 Hz | 24000 Hz | -V 4 (VBR 150kbps前後) | 44100 Hz |
| 64 kbps | 24000 Hz | 24000 Hz | -V 3 (VBR 164kbps前後) | 44100 Hz |
| 80 kbps | 32000 Hz | 32000 Hz | -V 2 (VBR 194kbps前後) | 44100 Hz |
| 96 kbps | 32000 Hz | 32000 Hz | -V 1 (VBR 218kbps前後) | 44100 Hz |
| 112 kbps | 44100 Hz | 44100 Hz | -V 0 (VBR 255kbps前後) | 44100 Hz |
| 128 kbps | 44100 Hz | 44100 Hz | ||
| 144 kbps | 44100 Hz | 44100 Hz | ||
| 160 kbps | 44100 Hz | 44100 Hz | ||
| 192 kbps | 44100 Hz | 44100 Hz | ||
| 224 kbps | 44100 Hz | 44100 Hz | ||
| 256 kbps | 44100 Hz | 44100 Hz | ||
| 320 kbps | 44100 Hz | 44100 Hz |
この表からわかる通り、LAMEでは“サンプリングレートの指定をしなかった場合”は、指定したビットレートの値に応じて自動で段階的にサンプリングレートを変える仕様になっています。
このLAMEの仕様の影響で、Embedタグでの読み込みに対応しているMP3のサンプリングレート3種類(44,100Hz、22,050Hz、11,025Hz)以外になった場合(上の表で赤色の部分)はエラーが起きてしまうということです。前回の記事でMP3エンコードしたときのビットレートはCBR方式の64kbpsだったので、上記の表にある通り24,000Hzになってしまったというわけです。
まとめ
MP3のエンコーダーにLAMEを使う場合は、コマンドラインオプションで必ずサンプリングレートの指定をするようにしておけば、Embedタグで読み込めないMP3ファイルが生成されることは無くなります。前回のおさらいになりますが、サンプリングレートは以下の例のように指定します。
-b 64 --resample 44.1
今回は、馬鹿全さんのEmbedに関する記事が無ければわからないことだらけでした。すばらしい情報をありがとうございました!
参考ページ
今回の件を調べるに当たって以下のページがとても参考になりました。素敵情報に感謝。
まとめ
このシリーズのエントリーは、「AS3入門」のまとめにまとめてあります。
*1:最初は3.97を使用していましたが、各ビットレート値の検証を行うにあたって、3.97では144kbpsのビットレートのMP3ファイルを正常に生成出来ないことに気づき、3.98.2にバージョンアップしました。
*2:条件を簡潔にするために、M/Sジョイントステレオを有効にする指定も削除してあります。
*3:「効果音的な1秒程度のサウンドファイル」と「BGM的な5分以上あるサウンドファイル」の2種類で検証していますが、表にある「目安となるkbps」は「BMG的な5分以上あるサウンドファイル」の平均ビットレートです。VBR方式は、元となるサウンドファイルの内容によって平均ビットレートにかなりの違いが出ます。
- 119 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&q=flex+16進数 変換&btnG=検索&lr=
- 77 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4ADBF_jaJP326JP326&q=ActionScriptライブラリ+使い方
- 73 http://blog.bk-zen.com/2009/08/07/203/
- 40 http://search.yahoo.co.jp/search?p=actionscript&search.x=1&fr=top_ga1_sa&tid=top_ga1_sa&ei=UTF-8&aq=0&oq=action
- 38 http://www.google.co.jp/search?hl=ja&lr=lang_ja&client=firefox-a&rls=org.mozilla:ja:official&hs=BVO&ei=Pk19StPeH4mWkQX519XvAg&sa=X&oi=spell&resnum=0&ct=result&cd=1&q=アクションスクリプ??%8
- 33 http://twitter.com/dkgkAs
- 26 http://www.google.co.jp/search?hl=ja&safe=off&client=firefox-a&rls=org.mozilla:ja:official&q=flashdevelop ショートカットキー rtm&btnG=検索&lr=lang_ja
- 25 http://www.google.co.jp/reader/view/
- 23 http://reader.livedoor.com/reader/
- 21 http://www.google.co.jp/search?hl=ja&q=flashdevelop+使い方&sourceid=navclient-ff&rlz=1B3GGGL_ja___JP322&ie=UTF-8&aq=t&oq=flashdevelop+





