我们需要用一个无插件的解决方案来替换我们的NPAPI浏览器插件。 我们有第三方的输入设备,为我们提供 住 音频以Opus "帧 "的形式存在。 我们使用二进制WebSockets将这些帧传送到浏览器,然后,将数据转发给我们的NPAPI插件进行解码和音频播放。 见图。
考虑到这些要求,我们应该采取什么样的方法,用一个类似HTML5的解决方案来取代NPAPI插件?
使用html5音频标签似乎会带来巨大的延迟,因为各种浏览器在开始播放之前都需要一定的缓冲时间(15-30s的音频)。 我们理解Opus可能会或可能不会在所有浏览器上得到支持。 如果需要的话(虽然我们宁愿不减少带宽),我们可以在将数据发送到浏览器之前,将Opus帧封装到Web服务中的Ogg容器中。 看看html5rocks的一个演示。HTML5音频游乐场貌似#2是可能的。
如果在这里问这样的设计问题不合适,请建议其他论坛组可能更合适。
谢谢您的任何帮助或建议。
由于你需要自己管理所有的缓冲和什么的,我认为最好的选择是在JavaScript中实际解码Opus帧。 作为奖励,你会得到更好的浏览器支持。
Aurora.js项目就有这方面的支持。 https:/github.comaudiocogsopus.js。 虽然现阶段还有点实验性。
如果你不需要使用Opus和WebSocket,你会有更多的选择。 标准版 <audio>
在大多数情况下,标签不需要超过几秒钟的音频缓冲区来开始播放。 当它这样做,它通常是因为内容类型头是错误的,播放器软件必须找出它是什么,需要一个更大的缓冲区工作。 或者,有一些其他的同步问题。
我也有类似的情况。我一直使用WebSockets和Media Source Extensions在Google Chrome中播放一个MP3 feed,几乎没有延迟,但MP3编解码器与MSE一起使用时,其他一些浏览器不支持。事实证明,大多数浏览器,至少是Chrome、Firefox、Opera和Edge,都可以用MSE原生播放Opus,前提是正确封装在MP4或WebM容器中。
在Ogg中打包Opus是相当简单的,I 将我发现的一些代码从JavaScript转换为C#。.
在WebM中打包Opus是比较复杂的。我写了 这段C#代码 从零开始,基于WebMMatroska 和 EBML 规格。当通过HTTP服务时,它在Chrome和Firefox中正确播放,但VLC似乎无法通过HTTP流式传输OpusWebM。至少Chrome要求时间序列从0开始,所以在服务器端打包并不是一个好的选择,因为这需要对分发系统进行修改。
最后,我 将其移植到JavaScript中 这样,每个客户端都可以将Opus帧打包到WebM中,时间戳从0开始,这样就可以在Chrome和Firefox中一秒内启动直播,而无需预缓冲。请注意,我在传入的websocket数据包上使用了4个字节的头,因为现有的分发系统并不保留数据包边界(它是为MP3流构建的)。如果你在每个opus帧中使用一个websocket帧,并且每帧使用固定数量的样本,你可以删除这个头。
现在剩下的就是为IE11、Safari和一些旧的移动浏览器找到一个解决方案......。