Hatena::ブログ(Diary)

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

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,10022,05011,025
読み込めるビットレート(単位:kbps)16012811280645648322420168
FlashゲームPG講座 For AS3.0【サウンドについて】

これによるとサンプリングレートは指定された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)でも使えるようになります。


参考ページ

今回の件を調べるに当たって以下のページがとても参考になりました。素敵情報に感謝。


まとめ

このシリーズのエントリーは、「AS3入門」のまとめにまとめてあります。

*1:再生する前にボリュームを変えたかったんですが、参考書などを見てもplayしてからsoundTransformしてるので、このやり方にすごく違和感が…。これは間違いなく自分の知識が足らないだけなのですが、もうちょっとサクッと使えたらな〜なんて思います。