所以我正在尝试使用Web Audio API
解码&使用Node.js& amp;播放流式传输到浏览器的MP3文件块Socket.IO。
我的问题是我唯一的选择是为收到的每个接收到的音频数据块创建新的AudioBufferSourceNode
,或者是否可以为所有块创建单个AudioBufferSourceNode并简单地将新音频数据附加到结尾源节点的buffer
属性?
目前,这就是我接收MP3块,解码和安排播放的方式。我已经验证了收到的每个块都是一个“有效的MP3块”,并且正在被Web Audio API成功解码。
audioContext = new AudioContext();
startTime = 0;
socket.on('chunk_received', function(chunk) {
audioContext.decodeAudioData(toArrayBuffer(data.audio), function(buffer) {
var source = audioContext.createBufferSource();
source.buffer = buffer;
source.connect(audioContext.destination);
source.start(startTime);
startTime += buffer.duration;
});
});
对于如何最好地使用新音频数据“更新”Web音频API播放的任何建议或见解将不胜感激。
答案 0 :(得分:5)
不,你不能重复使用AudioBufferSourceNode,并且你不能将push
放到AudioBuffer上。它们的长度是不变的。
本文(http://www.html5rocks.com/en/tutorials/audio/scheduling/)提供了有关使用Web Audio API进行计划的一些很好的信息。但是你走在正确的轨道上。
答案 1 :(得分:1)
目前,decodeAudioData()
需要完整的文件,无法在不完整的文件上提供基于块的解码。下一版本的Web Audio API应提供此功能:https://github.com/WebAudio/web-audio-api/issues/337
与此同时,我开始编写用于解码音频的示例,直到新的API版本可用。
答案 2 :(得分:0)
我看到至少2种可能的方法。
设置scriptProcessorNode
,它将为已接收的&将数据解码为实时的网络音频流。
利用audioBufferSource.loop
的属性 - 根据音频时间更新audioBuffer的内容。
这两种方法都在https://github.com/audio-lab/web-audio-stream中实施。您可以从技术上将其用于将收到的数据提供给网络音频。