Web Audio API onended事件不会触发

时间:2015-12-29 00:35:23

标签: javascript node.js socket.io web-audio arraybuffer

我对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)
        });
    })
})

1 个答案:

答案 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)
        });
    })
})

这一次,我实际上是将这些价值观推向了“来源”。数组,因此它没有被覆盖,事件被正确解雇。

我不确定这是否是最有效的方式(我几乎不认为),但它现在解决了我的问题。

如果有人有更好的解决方案,请告诉我:)