我们需要用无插件解决方案替换我们的NPAPI浏览器插件。我们有第三方输入设备,以Opus“帧”的形式向我们提供实时音频。我们使用二进制WebSockets将这些帧传输到浏览器。然后将数据转发到我们的NPAPI插件以进行解码和音频播放。见图片。
在满足这些要求的情况下,我们应该采用哪种方法用HTML5级别的解决方案替换NPAPI插件?
使用html5音频标签似乎会引入大量延迟,因为各种浏览器在开始播放之前需要一定数量的缓冲(15-30秒的音频)。我们了解所有浏览器可能会或可能不支持Opus。如果需要(尽管我们不想减少带宽),我们可以在将数据发送到浏览器之前将Opus帧封装到Web服务中的Ogg容器中。查看html5rocks的一个演示示例HTML5 Audio Playground,似乎可以使用#2。
如果这是一个提出此类设计问题的较差的地方,请建议其他更合适的论坛/论坛。
感谢您的帮助或建议。
最佳答案
我也有类似的情况。我一直在使用WebSockets和Media Source Extensions在Google Chrome浏览器中播放MP3提要,并且延迟很小,但是与MSE一起使用时,某些其他浏览器不支持MP3编解码器。事实证明,只要将浏览器正确封装在MP4或WebM容器中,大多数浏览器(至少Chrome,Firefox,Opera和Edge)都可以在MSE上原生播放Opus。
在Ogg中打包Opus非常简单,我converted some code I found from JavaScript to C#。
在WebM中打包Opus有点复杂。我是根据WebM/this C# code和Matroska规范从头开始编写EBML的。通过HTTP提供服务后,它可以在Chrome和Firefox中正常播放,但是VLC似乎无法通过HTTP流化Opus/WebM。至少Chrome要求时间序列从0开始,因此在服务器端打包不是一个好的选择,因为这将需要对分发系统进行修改。
最后我ported this to JavaScript,以便每个客户端可以将WebM中的Opus帧打包,时间戳正确地从0开始。这将启动实时流,而无需在一秒钟之内在Chrome和Firefox中预缓冲。请注意,我在传入的Websocket数据包上使用了4字节的 header ,因为现有的分发系统不保留数据包边界(它是为MP3流构建的)。如果每个作品帧使用一个websocket帧,并且每帧使用固定数量的样本,则可以删除此 header 。
现在剩下的就是为IE11,Safari和一些较旧的移动浏览器找到解决方案...
关于javascript - HTML5 : Playing live Opus audio frames without browser plug-in,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28326774/