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