BCBでmp3を使おう

 mp3(MPEG1 Audio Layer3)は、現在最もメジャーと思われる音声圧縮方式です。
 "聴感上"は、CDと同等の音質で128kbpsにまで圧縮できる(CDクオリティ=16bit量子化 標本化周波数44.1kHz ステレオの場合は、1424kbps)ことから、爆発的に普及し、音声圧縮の事実上の標準になっています。
 mp3以外にも、WMA(Windos Media Audio)やOggVorbis,TwinVQなど、さまざまな音声圧縮技術がありますが、ここに挙げた他の圧縮技術すべてが、個人利用かつ非商用の場合にはロイヤリティ問題なしでエンコーダ・デコーダを入手できるにもかかわらず、mp3以上に普及する様子はないようです(個人的にはWMAが好きなんですが・・・・。でも、最近はOggに浮気中)。

 まあ、それはさておき、BCBでmp3を使う方法は数多くあります。といっても、ここではデコードのはなしですが。
 最も簡単なのは、TMediaPlayer(MediaPlayerコンポーネント)を使った方法です。FileNameプロパティで再生対象のファイルを指定し、Open(),Play()と、順番にメソッドを呼ぶことで再生してくれます。MCI関連のAPIでも同じようにできますが、TMediaPlayerを使うよりは面倒です。
 TMediaPlayerを使った場合のサンプルコードは、以下のようになります。ここでは、フォーム(Form1)にTMediaPlayer(MediaPlayer1)、TOpenDialog(OpenDialog1)が張り付けてあるという事が前提です。

//-----------------------------------------------
if (OpenDialog1->Execute())
{
  MediaPlayer1->FileName = OpenDialog1->FileName;
  MediaPlayer1->Open();
  MediaPlayer1->Play();
}
//-----------------------------------------------

 このサンプルでは再生を止める部分は省いてありますので。適当な場所に MediaPlayer1->Stop(); を書いて、再生を止めれるようにしましょう。
 TMediaPlayerやMCIでは、ユーザがmp3のコーディックを用意していないと再生はできません。WindowsMediaPlayerやNetShowなどについてくるので、気にしなければ良いといえば良いのですが、これを嫌う人もいます。この場合は、VBMP3が有力な選択肢になるでしょう。

 VBMP3は、みけさんが公開しているmp3デコーダ内蔵のdllです。多機能で便利なため、さまざまなアプリケーションで利用されています。とりあえずならしてみるだけのサンプルがこちら。使用するには、VBMP3.dllとそのインポートライブラリが必要ですので、別途入手してください。
 VBMP3は、VB用に作られているため、そのままでは使用できません。dllの静的リンクを行う場合は、VBMP3のパッケージの他に、インポートライブラリと構造体や関数を定義したヘッダファイルが必要になります。インポートライブラリは、

implib libfilename dllfilename

とやれば作ることができますが、ヘッダファイルをVBのリファレンスから作るのは大変です。VCMP3をダウンロードしてくれば、ヘッダファイルがついてきますが、BCBではそのまま使えません(extern "C" がない)。一応、こんなふうに書き換えれば使えるようです。これは私が勝手にVCMP3付属のヘッダファイルを書き変えたもので、先に挙げたサンプルで使用している以外の関数の動作は一切チェックしていません。動かなかったら教えてください。
 非常に便利なVBMP3ですが、問題もあります。mp3を再生するだけのプレイヤーを作るのであれば良いのですが、デコードしたデータを取り出して加工したり、効果音とミキシングしたりしたい場合に問題があります。WindowsのwaveOutAPIのハンドルは、VXDドライバを使っている限りは、ドライバもしくはハードウエアが対応していない限り、複数取得することができません。「Windwos2000,XP以外はサポートしない」としてしまえば、WDMドライバはカーネルミキサがあるのでこんな事気にしなくてもいいんですけどね。

 DirectSoundを使えば、この問題を解決することができます。しかし、DirectSoundは、一つのプライマリバッファに関連づけられたセカンダリバッファをミキシングするので、mp3データをデコードして、セカンダリバッファに書き込んでやる必要があります。VBMP3は、私の知る限り、デコードしたデータを得る関数がないので、この方法には使えません。
 この方法で使えるのが、VBMP3のデコードエンジンのソースコード(もとは、XingがGPLで公開しているものらしい)、葉月ながれさんのmp3Dec、そしてACMです。ただし、ACMを用いる場合には、WAVEヘッダのついていないWAVEファイルを再生する場合にヘッダをでっち上げてやらなければなりませんし、MCI同様コーディックが必要にまります。


 ここまでは、アプリケーション側の使用にしたがって、どのようにmp3のデコード部分を実装すればよいかを書いてきましたが、mp3を扱うソフトウエアを作る場合に忘れてはいけないのが、mp3の特許問題です。
 mp3に関する特許を持っている Fraunhofer IIS-A と Tomson multimedia は、実際に特許使用料を徴収しています。この件に関してはいろいろと議論になっていますが、別にグレーゾーンに踏み込む必要はないわけで(特許使用料を徴収されるような用途であれば、特別な理由がないかぎり、OggなりWMAなり、別の圧縮方式を使えば良い)、どのような条件を満たすと使用料を払わなければならないかは知っておいたほうが良いでしょう。
 mp3のライセンスに関する情報は、mp3licensing.comで公開されています。ただし日本語訳はありませんが。
 一応、私が適当に意訳したところによると、
 (1). エンコーダ・デコーダのメーカーはライセンスを取得しなければならない。
 (2). 営利目的(言い換えれば、利益が生ずる)の放送にmp3でエンコードされたデータを用いる場合も、ライセンスを取得しなければならない。
 (3). mp3エンコードされたデータを販売する場合もライセンスを取得しなければならない。
 (5). ゲームでmp3エンコードされたデータを扱う場合もライセンスが必要。ただし、5000コピー未満ならライセンス料は必要ない。
 というような事が書いてあったと思います(誤訳・誤解などに関しては、一切の責任を負いません)。
 ここで扱っている内容に関連するのは(5)のケースだと思いますが、ライセンスを取得したエンコーダ・デコーダを使って、ゲームのBGMをならすような場合(再生ソフトのフロントエンド部分だけを作る場合も、この分類になぬのかな?)は、5000コピー(まあ、個人で作ったゲームをいくら売っても、こんなには売れないでしょう)未満ならライセンス料を請求しないようです。
 で、問題になるのが、デコーダに何を使えば良いのかという点ですが、TMediaPlayerやMCI,ACMで使うのが良いでしょう。これらがデコードに用いていると思われるFraunhofer のコーディックは、Microsoftがライセンスを受けて配っているはずなので、デコーダーのライセンス問題が回避できると思われます。


関連Link
mp3licensing.com
 mp3のライセンスに関する公式ページ。

VBMP3
 みけさんが公開しているVBMP3のサポートサイトです。

mp3Dec
 葉月ながれさんが公開しているmp3デコードdll。本当は、本人のページがある(あった?)らしいのですが、 書いてあるURLにはないので、ベクターのダウンロードページへのリンク。


last update 2002/08/17