我有一个桌面应用程序,它通过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没有播放任何声音也没有播放噪音。
答案 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);
。现在它工作正常!