BGMなどの長いサウンドを先頭から末尾まで全てメモリ上に展開すると、色々リソースを浪費するため、DirectSoundを使う場合はストリーミングバッファというものが使えます。これは、メモリ上に確保するバッファの長さは2秒分程度にして、バッファを再生していくにつれ内容を書き換えるという使用法を可能にするものです。よくウェブサイトから動画をダウンロードするとき「ストリーミング再生」という言葉を目にしますが、概念は同じです。特にデータサイズが大きい動画の場合、メモリ上に全てを展開することが不可能なこともあるでしょう。
そんな訳で、ストリーミング再生をすることは重要なのですが、用意する音声データの方もそれなりに問題になります。非圧縮PCMデータ(Waveファイル)の場合、サンプル当たり (チャンネル数) x (サンプリングサイズビット数 / 8) バイト消費します。CD並みの音質では2チャンネル16ビットのサンプルを44100Hzでサンプリングするので、例えば3分の曲では 2 x ( 16 / 8 ) x 44100 x ( 3 x 60 ) B = 31752000 B = 30.3 MB となる訳ですね。
こんなに容量が必要となると、迂闊にBGMとしてPCMデータを使えません。圧縮して配布する場合も、一般的な可逆圧縮では思うような圧縮率が得られませんし、使える状態(解凍済み)のデータはやっぱり大きいままです。
音声データを小さくするには、やはり音声データを圧縮することに特化した方法を使うのが一番です。それと、余程感度のいい耳を持っていない限り、多少の損失は判らない場合が多いので、可逆圧縮よりも非可逆圧縮をする方がいいでしょう。有名なものでMP3やWMAなどがありますが、今回は法律的制限が非常に緩やかなOgg Vorbisを使うことにします。
Ogg Vorbisとは、Xiph.orgで開発された、音声圧縮用のコーデックです。修正BSDライセンスで配布され、使用に際しては著作元の表示が義務づけられるのみで、ライセンス料を払ったり、ソースコードを開示したりする必要がありません。また、拡張子は大抵oggを使いますが、Oggというのはコンテナ名なので、Ogg Vorbis以外でも拡張子oggを持つことがあります。まぁ、難しい事は僕もよく知らないので、とにかくOgg Vorbisで書かれたデータをデコードしてPCMデータを得られるようにすることを目的にします。
とりあえずはOgg VorbisのSDKを用意しましょう。Xiph.org: Downloadsで、liboggとlibvorbisの安定化バージョンをダウンロードします(現時点ではlibogg 1.1.3、libvorbis 1.1.2が最新版)。これにはVC++ 6.0でビルドできるワークスペースファイルとプロジェクトファイルが同梱されています(win32ディレクトリ以下)。ただし、今回は使用しません。これを使うと確かに手軽に使えるようになるのですが、DLLのファイルサイズは大きくなります。それでもいいという人はVariousible - Developpers' Room - Ogg Vorbis SDKのビルドを参考にして下さい(これを書くに当たって参考にさせていただきました。感謝!)。VC++でスタティックリンクする場合には多分問題ないでしょう。その場合、libogg-x.x.xディレクトリをoggに、libvorbis-x.x.xディレクトリをvorbisにリネームしておくと楽です。
ちなみに、VC++ 6.0用プロジェクトをビルドしてそのDLL版を使う場合、必要なDLLはliboggのogg.dll、libvorbisのvorbisfile.dllとvorbis.dll(約1MB)の3つです。気付かないとはまりますが、vorbisfile_dynamicはvorbis_dynamicに依存しています。
コメントする