Hatena::ブログ(Diary)

独学ActionScript このページをアンテナに追加 RSSフィード

2009.08.08

【AS3入門】続・読み込み可能なMP3ファイルのフォーマット(追検証とLAMEの仕様について)

以前、Embedタグで読み込めるMP3ファイルについての記事を書き、その中でいくつか疑問点があったのですが、それについて、馬鹿全さんがEmbedタグに関連した詳しい検証記事を書いてくれていてとても参考になったので、自分の環境でも改めて追検証しました。また、サンプリングレートが意図せず変わってしまった件についても調べ直しました。サンプリングレートが変わってしまった原因は、LAME仕様のようです。 ※このエントリーで使用しているLAMEのバージョンはLAME 3.98.2です。


前回の記事を振り返って

前回の記事で、問題点・疑問点だったところを振り返ると、

  1. Loaderクラスでは読み込み可能なのに、Embedタグでは埋め込めないMP3ファイルがあった
  2. 調べてみると、埋め込めるMP3ファイルのフォーマットには制限があることがわかった
  3. 原因はサンプリングレートだったが、なぜサンプリングレートが変わったのかがわからなかった

といった感じだったのですが、(1)(2)について馬鹿全さんがEmbedタグに関する記事で詳しく検証してくれて、なんと(2)については参考にした読み込み可能なMP3ファイルフォーマットの一覧表に間違いがあることまでご指摘いただき、かなり自由なビットレートの値やビットレート方式のMP3ファイルが読み込み可能なことを教えていただきました。その教えていただいた情報をコピペするだけでは進歩がないのでw、今回は馬鹿全さんとほとんど同じ検証になりますが自分の環境でも追検証してみました。

また、前回MP3ファイルを作成した際に、なぜサンプリングレートが元のWAVファイルの「44,100 Hz」から違う数値に変わってしまったのかについても調べ直し、(3)の原因がわかったので記事にしておきます。


読み込み可能なMP3ファイルのフォーマット(馬鹿全さん調べ)

というわけで、馬鹿全さんが検証してくれた内容を元に前回の一覧表を修正してみると下記のようになります。前回の表との相違点を赤の太字にしてあります。

Embedタグで読み込めるMP3ファイルのフォーマット

方式読み込み可/不可
CBR(固定ビットレート
ABR(平均ビットレート
VBR(可変ビットレート
FFS(フリーフォーマットストリーム不明
読み込めるサンプリングレート(単位:Hz)44,10022,05011,025
読み込めるビットレート(単位:kbps)3202562241921601441281129680
64564840322420168
馬鹿全 - AS3 での Embed の話

この検証により、ビットレートの値、方式ともにLAME(後述のMP3エンコーダー)でエンコード出来るすべてに対応していることがわかり、Embedタグで読み込む際に問題となるのはサンプリングレートだけではないか、と馬鹿全さんは結論づけています。

で、これだけでは馬鹿全さんの検証のコピペだけになってしまうので、自分の環境でも追検証してみました。


新たに加わった読み込み可能なビットレートの追検証

前述の一覧表で、読み込み可能であると判明して新たに加わった箇所(赤の太字)について、自分の環境でも読み込み可能であるかを追検証してみました。

新たに加わったビットレートの方式ABR(平均ビットレートVBR(可変ビットレート
新たに加わったビットレートの値3202562241921449640

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.wavWAVファイルはまったく同じものです。この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方式の
サンプリングレート
指定したLAMEVBRオプション
(カッコ内は目安となるkbps)*3
VBR方式の
サンプリングレート
8 kbps8000 Hz8000 Hz-V 10 (VBR 29kbps前後)8000 Hz
16 kbps8000 Hz8000 Hz-V 9 (VBR 66kbps前後)22050 Hz
24 kbps8000 Hz8000 Hz-V 8 (VBR 93kbps前後)32000 Hz
32 kbps16000 Hz16000 Hz-V 7 (VBR 104kbps前後)32000 Hz
40 kbps16000 Hz16000 Hz-V 6 (VBR 122kbps前後)44100 Hz
48 kbps22050 Hz22050 Hz-V 5 (VBR 135kbps前後)44100 Hz
56 kbps24000 Hz24000 Hz-V 4 (VBR 150kbps前後)44100 Hz
64 kbps24000 Hz24000 Hz-V 3 (VBR 164kbps前後)44100 Hz
80 kbps32000 Hz32000 Hz-V 2 (VBR 194kbps前後)44100 Hz
96 kbps32000 Hz32000 Hz-V 1 (VBR 218kbps前後)44100 Hz
112 kbps44100 Hz44100 Hz-V 0 (VBR 255kbps前後)44100 Hz
128 kbps44100 Hz44100 Hz
144 kbps44100 Hz44100 Hz
160 kbps44100 Hz44100 Hz
192 kbps44100 Hz44100 Hz
224 kbps44100 Hz44100 Hz
256 kbps44100 Hz44100 Hz
320 kbps44100 Hz44100 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方式は、元となるサウンドファイルの内容によって平均ビットレートにかなりの違いが出ます。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/ActionScript/20090808/as3_mp3_embed_lame