我有一个客户端/服务器音频合成器,其中服务器(java)动态生成一个音频流(Ogg / Vorbis),由客户端使用HTML5音频元素呈现。用户可以调整各种参数,服务器会立即相应地改变输出。不幸的是,音频元素非常积极地缓冲(预取),因此用户所做的更改将在几分钟之后才会被听到。
尝试禁用预加载没有任何效果,显然此设置只是“建议”,因此不能保证它的行为在浏览器中保持一致。
我一直在阅读我在WebRTC和不断发展的WebAudio API上可以找到的所有东西,似乎我需要的所有部分都在那里,但我不知道是否可以按照我的方式连接它们喜欢。
我查看了RTCPeerConnection,它确实提供了低延迟,但它带来了许多我不想要或不需要的包袱(STUN,ICE,提供/回答等),目前它似乎只支持有限的设置编解码器,主要面向语音。此外,由于服务器端是java,我认为我必须做很多工作来教它“说”所涉及的各种协议和格式。
AudioContext.decodeAudioData适用于静态样本,但不适用于流,因为它不会处理传入的数据,直到它消耗整个流。
我想要的是没有任何缓冲的音频标签(即HTMLAudioElement)的确切功能。如果我能以某种方式创建一个使用服务器URL作为其输入的MediaStream对象,那么我可以创建一个MediaStreamAudioSourceNode并将该输出发送到context.destination。这与AudioContext.decodeAudioData已经做的完全不同,除了该方法创建静态缓冲区而不是流。
我想保留Ogg / Vorbis压缩并最终使用其他编解码器,但我接下来要尝试的一件事就是发送原始PCM并动态构建音频缓冲区,就像它们是由javascript以编程方式生成的一样码。但同样,我认为所有部分已经存在,如果有任何方法可以利用它,我会非常激动地了解它!
提前致谢, 乔
答案 0 :(得分:0)
你过得怎么样?你有没有解决这个问题?我正在解决类似的挑战。在浏览器方面,我使用web音频API,它有很好的方式来呈现流输入音频数据,服务器端的nodejs使用web套接字作为中间件来发送浏览器流式PCM缓冲区。