onload
関数のおかげで、画像を簡単にプリロードできます。しかし、オーディオでは機能しません。 Chrome、Safari、Firefoxなどのブラウザーは、audioタグのonload
関数をサポートしていません。
JSライブラリを使用せず、HTMLタグを使用または作成せずに、Javascriptでサウンドをプリロードするにはどうすればよいですか?
あなたの問題は、オーディオオブジェクトが「ロード」イベントをサポートしていないことです。
代わりに、「canplaythrough」と呼ばれるイベントがありますが、これは完全にロードされているわけではありませんが、十分な量がロードされているため、現在のダウンロードレートで、トラックが再生するのに十分な時間までに終了します。
代わりに
audio.onload = isAppLoaded;
試してみる
audio.oncanplaythrough = isAppLoaded;
またはもっと良い..;)
audio.addEventListener('canplaythrough', isAppLoaded, false);
Tylermwashburnが受け入れた回答を試しましたが、Chromeでは機能しませんでした。そこで私はこれを続けて作成し、jQueryの恩恵を受けました。また、oggとmp3のサポートを探ります。 192KBSのoggファイルは320KBSのMP3と同じくらい良いと言う専門家もいるため、デフォルトはoggであり、必要なオーディオダウンロードの40%を節約できます。ただし、IE9にはmp3が必要です。
// Audio preloader
$(window).ready(function(){
var audio_preload = 0;
function launchApp(launch){
audio_preload++;
if ( audio_preload == 3 || launch == 1) { // set 3 to # of your files
start(); // set this function to your start function
}
}
var support = {};
function audioSupport() {
var a = document.createElement('audio');
var ogg = !!(a.canPlayType && a.canPlayType('audio/ogg; codecs="vorbis"').replace(/no/, ''));
if (ogg) return 'ogg';
var mp3 = !!(a.canPlayType && a.canPlayType('audio/mpeg;').replace(/no/, ''));
if (mp3) return 'mp3';
else return 0;
}
support.audio = audioSupport();
function loadAudio(url, vol){
var audio = new Audio();
audio.src = url;
audio.preload = "auto";
audio.volume = vol;
$(audio).on("loadeddata", launchApp); // jQuery checking
return audio;
}
if (support.audio === 'ogg') {
var snd1 = loadAudio("sounds/sound1.ogg", 1); // ie) the 1 is 100% volume
var snd2 = loadAudio("sounds/sound2.ogg", 0.3); // ie) the 0.3 is 30%
var snd3 = loadAudio("sounds/sound3.ogg", 0.05);
// add more sounds here
} else if (support.audio === 'mp3') {
var snd1 = loadAudio("sounds/sound1.mp3", 1);
var snd2 = loadAudio("sounds/sound2.mp3", 0.3);
var snd3 = loadAudio("sounds/sound3.mp3", 0.05);
// add more sounds here
} else {
launchApp(1); // launch app without audio
}
// this is your first function you want to start after audio is preloaded:
function start(){
if (support.audio) snd1.play(); // this is how you play sounds
}
});
さらに:mp3からoggへのコンバーターは次のとおりです。 http://audio.online-convert.com/convert-to-ogg または、VLC Media Playerを使用して変換できます。 mp3ファイルを右クリックして(Windowsの場合)、ファイルの詳細に移動して、mp3ビットレートを確認します。新しい「ogg」ファイルに新しいビットレートを選択するときは、40%削減してください。コンバーターはエラーをスローする可能性があるため、受け入れられるまでサイズを増やし続けます。もちろん、十分な品質のサウンドをテストしてください。また、(これは私にも当てはまります)VLC Media Playerを使用してオーディオトラックをテストしている場合は、ボリュームを100%以下に設定してください。そうしないと、オーディオの劣化が聞こえ、圧縮の結果であると誤解される可能性があります.
ファイルに対してajaxリクエストを作成しようとしましたか?それが完全にロードされるまで、あなたはそれを表示/使用しません。
例えば。 jQuery:サウンドをどのようにプリロードしますか? (jQueryを使用する必要はありません)。
ターゲットブラウザによっては、prelaod
タグに audio
属性を設定するだけで十分な場合があります。
//Tested on Chrome, FF, IE6
function LoadSound(filename) {
var xmlhttp;
if (window.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();
} else { // code for IE6, IE5
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
document.getElementById("load-sound").innerHTML = '<embed src="' + filename + '" controller="1" autoplay="0" autostart="0" />';
}
}
xmlhttp.open("GET", filename, true);
xmlhttp.send();
}
参照
Remyは、Spriteコンセプトを利用するiOS向けのソリューションを思い付きました。
http://remysharp.com/2010/12/23/audio-sprites/
プリロードに直接対処するかどうかはわかりませんが、1つのオーディオファイルをロードするだけで済むという利点があります(これも欠点だと思います)。