2014-01-22 82 views
4

Firefox似乎正在处理音频,但不会播放它。这个确切的代码适用于Chrome。我没有看到控制台出现任何错误,所以我真的不知所措。我认为它与audioBuffer.getChannelData(0).set(audio)有关;但我不确定。任何人都知道为什么这个音频不会在FF中播放,但会在Chrome中播放?我现在正在运行FF 27。Web音频在Chrome浏览器中播放,但不是Firefox

window.AudioContext = window.AudioContext || window.webkitAudioContext; 
var context = new AudioContext(); 
var init = 0; 
var nextTime = 0; 
var audioStack = []; 

function toArrayBuffer(buffer) { 
    var ab = new ArrayBuffer(buffer.length); 
    var view = new Uint8Array(ab); 
    for (var i = 0; i < buffer.length; ++i) { 
    view[i] = buffer[i]; 
    } 
    return ab; 
} 

socket.on('stream', function(data) { 
    audioStack.push(data); 
    //if ((init!=0) || (audioStack.length > 10)) { // make sure we put at least 10 chunks in the buffer before starting 
      init++; 
      scheduleBuffers(); 
    //} 
}); 

function scheduleBuffers() { 
    while (audioStack.length) { 

     var data = toArrayBuffer(audioStack.shift().data); 
     var audio = []; 
     audData = new Int16Array(data); 
     for (var i = 0; i < audData.length; i++) { 
      audio[i] = (audData[i]>0)?audData[i]/32767:audData[i]/32768; // convert buffer to within the range -1.0 -> +1.0 
     } 

     var source  = context.createBufferSource(); 
     var audioBuffer = context.createBuffer(1, audio.length , 44100); 
     source.buffer = audioBuffer; 

     audioBuffer.getChannelData(0).set(audio); 

     source.connect(context.destination); 
     if (nextTime == 0) 
      nextTime = context.currentTime + 0.05; /// add 50ms latency to work well across systems - tune this if you like 
     source.start(nextTime); 
     console.log('length: '+source.buffer.duration); 
     nextTime+=source.buffer.duration; // Make the next buffer wait the length of the last buffer before being played 
    }; 
} 
+0

你介意链接到显示问题的完整网页吗? –

+0

这里雅去:https://github.com/grkblood13/web-audio-stream/tree/master/socketio/socketio-pcm –

回答

7

看这段代码:

source.buffer = audioBuffer; 
    audioBuffer.getChannelData(0).set(audio); 

可以尝试更改这两行的顺序?换句话说,首先设置audioBuffer的通道数据,然后将其分配给source.buffer。这是否解决了你的问题?

+0

是的,这解决了问题!由于浏览器之间的结果不同,这会被认为是一个错误吗? –

+0

这将会导致未来在Chrome中出现问题。这是规范处理潜在竞争条件的相对较新的变化。 – cwilso

+3

是的。这里的问题是,当您在AudioBufferSourceNode上设置缓冲区属性时,我们将在分配的右手边符号处使用的AudioBuffer对象中的基础数组缓冲区中,以便将来无法修改数组缓冲区影响音频线程看到的内容。正如Chris所说,这是为了防止潜在的竞争条件。 设置缓冲区属性后,您的代码依赖于对AudioBuffer底层数组缓冲区的修改。希望这可以帮助。 – ehsan

相关问题