我对Node流的世界非常陌生,所以原谅我缺乏信息。
我有一个简单的Node服务器接收文件流(使用BinaryJS),然后将其作为ArrayBuffer重新广播回客户端。本质上,假设我从服务器获得了一个ArrayBuffer,我想重新播放它。我现在正在对其进行解码,每次创建新的源和调度回放。这一切似乎都有效。
但是,每次块结束时我想触发另一个函数。虽然''onended'事件似乎没有被解雇。有人可以帮忙吗?感谢。
client.on('open', function() {
var stream = client.send(file)
client.on('stream', function(stream) {
var nextTime = 0.01
stream.on('data', function(data) {
console.log('Receiving data from server')
context.decodeAudioData(data, function(audioBuffer) {
var source = context.createBufferSource()
source.buffer = song[song.length-1]
source.connect(context.destination);
source.onended = function() {
console.log('Buffer depleted')
}
source.start(nextTime)
nextTime += audioBuffer.duration - 0.01
})
})
stream.on('end', function() {
console.log('End of stream, ' + current)
});
})
})
答案 0 :(得分:0)
经过一段时间的努力并在网上看到很多答案之后,我认为我的代码不起作用的原因是因为我不断重写“源”。变量。由于它只是一个实例(C ++人员的指针),它只指向最新的源代码。从本质上讲,它会被覆盖之前事件可能会触发。
我通过“缓存”解决了这个问题。所有数据源和缓冲区。
client.on('open', function() {
var stream = client.send(file)
client.on('stream', function(stream) {
stream.on('data', function(data) {
console.log('Receiving data from server')
context.decodeAudioData(data, function(audioBuffer) {
sources.push(context.createBufferSource())
song.push(audioBuffer)
sources[sources.length-1].buffer = song[song.length-1]
sources[sources.length-1].connect(context.destination);
sources[sources.length-1].onended = function() {
console.log('Buffer depleted')
current += 1;
}
sources[sources.length-1].start(nextTime)
nextTime += audioBuffer.duration - 0.01
})
})
stream.on('end', function() {
console.log('End of stream, ' + current)
});
})
})
这一次,我实际上是将这些价值观推向了“来源”。数组,因此它没有被覆盖,事件被正确解雇。
我不确定这是否是最有效的方式(我几乎不认为),但它现在解决了我的问题。
如果有人有更好的解决方案,请告诉我:)