2009.07.18
【AS3入門】読み込み可能なMP3ファイルのフォーマット
(2009.08.08 12:38 追記) 馬鹿全さんがEmbedタグで読み込めるMP3ファイルについての詳しい検証をしてくれていて、それを参考に続編記事を書きましたのでそちらも併せてご覧ください。
効果音用のMP3ファイルを読み込もうとして、軽くつまずいたので備忘録。同じMP3ファイルで、Loaderクラスを使った読み込みの時はエラーが出なかったのに、Embedタグを使った埋め込みではエラーが出ました。その原因はサンプリングレートでした。
読み込み可能なMP3ファイルのフォーマット
素材を外部ファイルからの読み込みではなく、SWFファイル1個にまとめる(埋め込む)必要が出て、読み込み方をLoaderクラスからEmbedタグに変えたら、MP3ファイルに関して以下のようなエラーが出て「おや?」と思いました。もちろん、対象のMP3ファイルはまったく同じものを使用しています。
col: 4: Error: unsupported sampling rate (24000Hz)
で、AS3のサンプリングレートについて調べてみると、こちらのページが見つかって、AS3で読み込み可能なMP3ファイルのフォーマットについてわかりやすい表が掲載されていました。以下はその部分の引用。
※下記の表に関して、内容が正しくないことが判明しました。詳しくは馬鹿全さんの検証記事、および当ブログの続編記事をご覧ください。
読み込み可能な mp3 のフォーマット
方式 読み込み可/不可 CBR(固定ビットレート) ○ ABR(平均ビットレート) × VBR(可変ビットレート) × FFS(フリーフォーマットストリーム) ×
読み込めるサンプリングレート(単位:Hz) 44,100 22,050 11,025 FlashゲームPG講座 For AS3.0【サウンドについて】
読み込めるビットレート(単位:kbps) 160 128 112 80 64 56 48 32 24 20 16 8
これによるとサンプリングレートは指定された3種類しかダメらしく、エラーにある24,000Hzは対象外の模様。元のMP3ファイルを調べてみたら確かにサンプリングレートが24,000Hzでした。MP3ファイルを作る時になんとなく、CBR方式で4の倍数のビットレートじゃないとダメだろうな〜くらいには思ってたんですが、サンプリングレートって今まで一度も意識したことがありませんでしたw
というわけで、上記の読み込み可能フォーマットに適合するようにサンプリングレートを44.1kHzに変更し、他もCBR方式、64kbpsで再度MP3ファイルを作り直したら、エラーが出ることなく正常に埋め込まれました。
それにしても、同じMP3ファイルでLoaderクラスならオッケーだったのはなぜでしょう? ここは未だに理由がわかりません。
LAMEのコマンドラインオプション
エンコードにはLAMEを使っていますが、上記のAS3で読み込み可能なサンプリングレート(44.1kHz)に変更するために、LAMEのコマンドラインオプションを調べました。次また必要になった時に忘れてそうなのでこれも備忘録。LAMEのコマンドラインオプションについてはこのページが詳しかったです。
-b 64 --resample 44.1
「-b」はCBR方式でエンコードを行う指定、「64」はビットレートの指定、「--resample 44.1」は出力データのサンプリングレート(KHz)を指定(エンコード時のみ)、指定出来るサンプリングレートの値はMPEG-1 Audio Layer-3の場合、32k、44.1k、48kHzの3種類です。結果的にAS3で使う場合、指定するサンプリングレートはMPEG-1 Audio Layer-3(いわゆるMP3)であれば44.1kHzになると思います。
サウンドを簡単に扱えるラッパークラス
ちなみに、AS3でのサウンドファイルの扱いはなにやらややこしくてよくわかりません。ボリュームを変えるだけでも一苦労です。*1 そこで色々探してみたら、KAYACさんのブログで素敵なラッパークラスが紹介されていました。
AS3になってサウンド周りが一気に高機能になってできることが増えたのですが普段使う時は9割方がただ鳴らしたいだけ、ループしたいだけって程度でSoundChannelとかSoundTransformとか気にする意味ない事ばっかりなので、くるっとラップしてお手軽にしてます。くるっと。
サウンドまわりの扱いがめんどくさいので。 | _level0 | Kayac Interactive Designer’s Blog
これは本当に便利なのでオススメです。上の説明文通り、読み込んだSoundクラスのインスタンスをくるっとラッピングするだけで、簡単にボリュームを変えたり再生したりできるようになります。
ただし、公開されている「SoundWrapper.as」をそのままFlashDevelopで使おうとしても結構色々なアラートが出ます。これは変数宣言時の型指定とか、戻り値の型指定とかが省略されているためで、おそらくFlash CS3用に書かれているからだと思います。そこらへんを1つずつ修正して(型指定を追加するだけ)すべてクリアすれば、そういう部分に厳しい(?)FlashDevelop(Flex SDK)でも使えるようになります。
参考ページ
今回の件を調べるに当たって以下のページがとても参考になりました。素敵情報に感謝。
- FlashゲームPG講座 For AS3.0【サウンドについて】
- サンプリングレートとビットレート、どう違う? - デジタル - 日経トレンディネット
- サンプリングレートとは 【サンプリング周波数】 - 意味/解説/説明/定義 : IT用語辞典
- LAME 3.98 stable コマンドラインオプション
- サウンドまわりの扱いがめんどくさいので。 | エントリー | _level0.KAYAC
まとめ
このシリーズのエントリーは、「AS3入門」のまとめにまとめてあります。





