Safari上是否支持Web Audio API source.start(0)(它在Chrome上运行正常)?

时间:2013-09-29 20:58:48

标签: javascript html5 google-chrome safari web-audio

我正在尝试实现Web Audio API。该代码适用于Chrome 29.0.1547.76,但不适用于Safari 6.0.5(8536.30.1)。关键是我是使用noteOn(0)还是start(0)。

我想使用start()以便我可以播放声音的一部分:

asource.start(0, 2, 1);

在Chrome中运行良好(立即播放,从2秒开始,播放1秒)但结果为

TypeError: 'undefined' is not a function (evaluating 'asource.start(0, 2, 1)')
Safari上的

。用

替换那一行
asource.noteOn(0);

的工作原理。 [好吧,我需要调用noteOff(0)而不是stop(0)。]我在start(0)时得到了同样的错误。所以,我假设Safari没有实现start(0)?但是,如果是这样,为什么在HTML5 Rocks使用start(0)的一些例子工作?

供参考,这是完整的网页。我尝试了很多不同的声音/格式;都会导致同样的错误。

<!DOCTYPE html>
<html lang=en>
<head>
<meta charset="utf-8">
<title>Web Audio API Issue</title>
</head>
<body>
<p>Example working on Chrome but not Safari when using start()</p>

<button id="Load" onclick="init()" >Load</button>
<button id="Play" onclick="playSound()" disabled>Play</button>
<button id="Stop" onclick="stopSound()" disabled>Stop</button>

<script>
    var web_audio_context;
    var abuffer;
    var asource;

    function init() {
        contextClass = (window.AudioContext || 
            window.webkitAudioContext || 
            window.mozAudioContext || 
            window.msAudioContext);
        web_audio_context = new contextClass();

        var theURL = './digits.mp3';
        var xhr = new XMLHttpRequest();
        xhr.open('GET', theURL, true);
        xhr.responseType = 'arraybuffer';
        xhr.onload = function(e) {
            finishedLoading(this.response);
        };
        xhr.send();
    }

    function finishedLoading(arrayBuffer) {
        web_audio_context.decodeAudioData(arrayBuffer, function(buffer) {
            abuffer = buffer;
            document.getElementById('Load').disabled = true;
            document.getElementById('Play').disabled = false;
            document.getElementById('Stop').disabled = false;
        }, function(e) {
            console.log('Error decoding file', e);
        }); 
    }

    function playSound() {
        asource = web_audio_context.createBufferSource();
        asource.buffer = abuffer;
        asource.connect(web_audio_context.destination);
        asource.start(0, 2, 1);

    }

    function stopSound() {
        asource.stop(0);
    }
</script>
</body>
</html>

2 个答案:

答案 0 :(得分:4)

在较新的Web Audio API版本中,方法noteOn将重命名为start。 Safari仍然使用旧版本,而Chrome使用更新版本。

试试吧:

asource.start ? asource.start(0, 2, 1) : asource.noteOn(0, 2, 1);

答案 1 :(得分:2)

尝试将Chris Wilson的Web Audio API monkey patch库添加到您的项目中。 这可能有所帮助。