いよいよIE9が日本でもリリースされますが、ようやくIEでもAudioタグが採用されました。そこで音楽の再生について考えてみたいと思います。
まず、既知の問題ですが今のところ全てのブラウザーで再生出来るフォーマットはありません。また、IE8までのブラウザーでも同じコードが使用できるように考慮します(Windows限定)。
とりあえず、Audio タグとして以下のコードが使用できるようにします。
audio = new Audio(); audio.src = "sound.mp3"; audio.play();
Window Media Player
埋め込みタグ(object)を使用して、Audioコントロールが無ければ作成します。
if (window.Audio == null) {
Audio = function () {
if (!document.getElementById('Player')) {
document.write('<object id="Player" classId="clsid:6BF52A52-394A-11d3-B153-00C04F79FAA6" height="45">');
document.write('<PARAM name="uiMode" value="invisible">');
document.write('</object>');
var e = document.getElementById('Player');
e.standBy = "loading...";
}
};
Audio.prototype = {
autoplay: false,
preload: false,
src: "",
loop: true,
controls: true,
canPlayType: function (mime) {
var canType = new Array("audio/wav", "audio/mid", "audio/mpeg");
for (var i = 0; i < canType.length; i++) {
if (mime == canType[i]) {
return true;
}
}
return false;
},
play: function () {
var e = document.getElementById('Player');
e.URL = this.src;
e.autoStart = false;
e.loop = this.loop;
if (this.controls) {
e.height = "45";
e.uiMode = "mini";
} else {
e.height = "1";
e.uiMode = "invisible";
}
e.controls.play();
},
stop: function () {
var e = document.getElementById('Player');
e.controls.stop();
},
pause: function () {
var e = document.getElementById('Player');
e.controls.pause();
},
resume: function () {
var e = document.getElementById('Player');
e.controls.play();
}
}
}
汎用化
ここからが本題ですが、どのブラウザーでもBGMを再生出来るようにします。
結論から言ってしまえば、あらかじめ複数のコーデックのファイルを用意しておき、再生可能なコーデックのファイルを選択して再生します。
まずは、音の情報を用意します。
source = [
{ src: "http://localhost/dqfw/sound/town.mp3", type: "audio/mpeg" },
{ src: "http://localhost/dqfw/sound/town.ogg", type: "audio/ogg"}];
この情報を元にcanPlayType()を使用して再生可能なファイルを選択します。
audio = new Audio();
function playSound(src) {
audio.controls = true;
for (var i = 0; i < src.length; i++) {
if (audio.canPlayType(src[i].type)) {
if (audio.appendChild) {
document.body.appendChild(audio);
}
audio.src = src[i].src;
audio.play();
}
}
}
再生するにはplaySound(source);とします。
サンプルを用意しました。