私は HTML5 を使用してゲームをプログラミングしていますが、現在直面している障害はサウンド効果の再生方法です。
具体的な要件はいくつかあります。
- 複数のサウンドを再生およびミックスし、
- 同じサンプルを複数回再生し、重複して再生する場合もあります。
- サンプルの再生を任意の時点で中断し、
- できれば、(低品質の)生の PCM を含む WAV ファイルを再生しますが、もちろんこれらを変換することもできます。
私の最初のアプローチは、HTML5 要素を使用して<audio>
、ページ内のすべてのサウンド効果を定義することでした。Firefox は WAV ファイルを問題なく再生しますが、#play
複数回呼び出してもサンプルが複数回再生されるわけではありません。HTML5 仕様の私の理解では、要素は<audio>
再生状態も追跡するため、それが理由です。
すぐに思いついたのはオーディオ要素を複製することだったので、それを実行するための次の小さな JavaScript ライブラリを作成しました (jQuery に依存)。
var Snd = {
init: function() {
$("audio").each(function() {
var src = this.getAttribute('src');
if (src.substring(0, 4) !== "snd/") { return; }
// Cut out the basename (strip directory and extension)
var name = src.substring(4, src.length - 4);
// Create the helper function, which clones the audio object and plays it
var Constructor = function() {};
Constructor.prototype = this;
Snd[name] = function() {
var clone = new Constructor();
clone.play();
// Return the cloned element, so the caller can interrupt the sound effect
return clone;
};
});
}
};
Snd.boom();
これで、 Firebug コンソールから を実行して再生できるようになりましたsnd/boom.wav
が、同じサンプルを複数回再生することはできません。この<audio>
要素は、サウンド エフェクトを再生するためのものではなく、ストリーミング機能に近いようです。
これを実現する賢い方法はありますか? HTML5 と JavaScript のみを使用するのが望ましいのですが、私は見逃しています。
また、私のテスト環境は Ubuntu 9.10 上の Firefox 3.5 であることも言及しておきます。私が試した他のブラウザ (Opera、Midori、Chromium、Epiphany) では、さまざまな結果が出ました。何も再生されないものもあれば、例外をスローするものもありました。
ベストアンサー1
HTML5Audio
オブジェクト
<audio>
要素を気にする必要はありません。HTML 5では、Audio
オブジェクト直接:
var snd = new Audio("file.wav"); // buffers automatically when created
snd.play();
現在のバージョンの仕様では混合はサポートされていません。
同じサウンドを複数回再生するには、オブジェクトのインスタンスを複数作成します。再生が終了した後にオブジェクトをAudio
設定することもできます。snd.currentTime=0
JSコンストラクタはフォールバック<source>
要素をサポートしていないため、
(new Audio()).canPlayType("audio/ogg; codecs=vorbis")
ブラウザが Ogg Vorbis をサポートしているかどうかをテストします。
ゲームや音楽アプリ(単なるプレーヤー以上のもの)を作成する場合は、より高度なWeb Audio API、現在はほとんどのブラウザでサポートされています。