【发布时间】:2013-12-26 21:05:16
【问题描述】:
我在上一篇文章中提出了这个问题,但由于它与原始问题无关,因此我将其单独发布。我无法像在媒体播放器中一样通过网络音频播放传输的音频。我尝试了 2 种不同的传输协议,binaryjs 和 socketio,但在尝试通过 Web Audio 播放时都没有任何区别。为了排除音频数据的传输问题,我创建了一个示例,该示例在从客户端接收数据后将数据发送回服务器并将返回转储到标准输出。将其导入 VLC 会产生您期望听到的聆听体验。
要在通过 vlc 播放时听到结果(听起来应该是这样),请使用以下命令在 https://github.com/grkblood13/web-audio-stream/tree/master/vlc 运行示例:
$ node webaudio_vlc_svr.js | vlc -
无论出于何种原因,当我尝试通过 Web Audio 播放相同的音频数据时,它都失败了。结果是随机噪声,中间有很大的静音间隙。
以下代码有什么问题导致播放声音如此糟糕?
window.AudioContext = window.AudioContext || window.webkitAudioContext;
var context = new AudioContext();
var delayTime = 0;
var init = 0;
var audioStack = [];
client.on('stream', function(stream, meta){
stream.on('data', function(data) {
context.decodeAudioData(data, function(buffer) {
audioStack.push(buffer);
if (audioStack.length > 10 && init == 0) { init++; playBuffer(); }
}, function(err) {
console.log("err(decodeAudioData): "+err);
});
});
});
function playBuffer() {
var buffer = audioStack.shift();
setTimeout( function() {
var source = context.createBufferSource();
source.buffer = buffer;
source.connect(context.destination);
source.start(context.currentTime);
delayTime=source.buffer.duration*1000; // Make the next buffer wait the length of the last buffer before being played
playBuffer();
}, delayTime);
}
完整来源:https://github.com/grkblood13/web-audio-stream/tree/master/binaryjs
【问题讨论】:
-
这个问题有点老了,但是我在你的仓库上测试了代码没有成功,你有什么更新吗?
标签: html node.js audio-streaming web-audio-api