Web Audio加载.mp3和.ogg

时间:2015-04-28 15:57:30

标签: javascript arrays audio web ogg

我正在使用javascript和网络音频制作画布游戏。为了让它在Firefox中工作,我有一份.ogg格式的所有音频文件的副本。加载这些文件的代码如下。为了获得所需的音频文件,我使用'playSound(samplebb [3],channel1); ',我这样做就像在我的应用程序中一样,根据数字选择样本很有用,例如可以使用概率和随机性选择声音。

我在一个论坛上看到“加载器会接受[mp3和ogg]同样的声音,只是传递数组中的两个路径而不是单个字符串。” 第四行代码是我尝试这个但它不起作用。

是否可以像这样为每个mp3加载备用ogg文件? (在一个缓冲区列表中)或者,如果浏览器是Firefox,我是否必须检测浏览器并构建一个oggs缓冲列表?

由于

function loadSounds() {
bufferLoader = new BufferLoader(audioContext,
    [
        ['sounds/1-KICK.mp3', 'sounds/1-KICK.ogg'],      //0  // Not found
        'sounds/2-BASS.mp3',      //1
        'sounds/3-BASS2.mp3',     //2
        'sounds/4-BASS4.mp3'      //3
        // ...  ...   ...
    ],
    finishedLoading
);
bufferLoader.load();
}


function finishedLoading(bufferList) {
for (var i = 0, l = bufferList.length; i < l; i += 1) {
    var source = audioContext.createBufferSource();
    source.buffer = bufferList[i];
    source.connect(audioContext.destination);
    var note = {
        note: source,
        ready: true
    };
    samplebb.push(note);
}
setTimeout(play, 1000);
}

1 个答案:

答案 0 :(得分:1)

您使用的是BufferLoader from html5rocks吗?如果是这样,the JS file清楚地表明它只需要字符串(而不是数组)作为url参数。但是,您可以修改类,使其按您的需要工作。请改用以下BufferLoader.loadBuffer()函数:

BufferLoader.prototype.loadBuffer = function(url, index) {
    // Load buffer asynchronously
    var request = new XMLHttpRequest(),
      mult = typeof url != 'string',
      srcInd = 0;
    request.open("GET", mult ? url[srcInd++] : url, true);
    request.responseType = "arraybuffer";

    var loader = this;

    request.onload = function() {
        // Asynchronously decode the audio file data in request.response
        loader.context.decodeAudioData(
            request.response,
            function(buffer) {
                if (!buffer) {
                    if(!mult || srcInd == url.length) {
                        console.error('error decoding file data:', url);
                        return;
                    } else {
                        console.info('error decoding file data, trying next source');
                        request.open("GET", url[srcInd++], true);
                        return request.send();
                    }
                }
                loader.bufferList[index] = buffer;
                if (++loader.loadCount == loader.urlList.length)
                    loader.onload(loader.bufferList);
            },
            function(error) {
                if(!mult || srcInd == url.length) {
                    console.error('decodeAudioData error:', url);
                    return;
                } else {
                    console.info('decodeAudioData error, trying next source');
                    request.open("GET", url[srcInd++], true);
                    return request.send();
                }
            }
        );
    }

    request.onerror = function() {
        if(!mult || srcInd == url.length) {
            console.error('BufferLoader XHR error:', url);
            return;
        } else {
            console.info('BufferLoader XHR error, trying next source');
            request.open("GET", url[srcInd++], true);
            return request.send();
        }
    }

    request.send();
}