播放实时音频流 - html5

时间:2014-06-01 22:18:05

标签: html html5 audio html5-audio web-audio

我有一个桌面应用程序,它通过websocket连接将原始PCM数据流式传输到我的浏览器。该流看起来像...\\x00\\x00\\x02\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\xff\\xff\\xff\\xff\\...

问题很简单:我可以使用Web Audio API / WebRTC / ...播放这样的HTML流吗?

非常欢迎任何建议!

代码编辑

此代码播放随机生成的噪音:

function myPCMSource() { 
    return Math.random() * 2 - 3;
}

var audioContext;

try {
    window.AudioContext = window.AudioContext || window.webkitAudioContext;
    audioContext = new AudioContext();
} catch(e) {
    alert('Web Audio API is not supported in this browser');
}

var bufferSize = 4096;
var myPCMProcessingNode = audioContext.createScriptProcessor(bufferSize, 1, 1);
myPCMProcessingNode.onaudioprocess = function(e) {
    var output = e.outputBuffer.getChannelData(0);
    for (var i = 0; i < bufferSize; i++) {
     output[i] = myPCMSource(); 
 }
}

所以将myPCMSource()更改为websocket流输入,应该让它以某种方式工作。但事实并非如此。我没有收到任何错误,但API没有播放任何声音也没有播放噪音。

1 个答案:

答案 0 :(得分:1)

使用ScriptProcessorNode,但请注意,如果主线程上有太多负载(运行javascript的线程,绘制屏幕等),它将会出现故障。

此外,您的PCM流可能在int16中,Web Audio API在float32方面工作。像这样转换它:

output_float[i] = (input_int16[i] / 32767);

即从[0; 65535]范围到[-1.0; 1.0]范围。

修改 我使用的是output_float[i] = (input_int16[i] / 32767 - 1);,此article表示您应该使用output_float[i] = (input_int16[i] / 32767);。现在它工作正常!