HTML5: 无需浏览器插件,即可播放Opus音频直播帧。

问题描述 投票:5回答:2

我们需要用一个无插件的解决方案来替换我们的NPAPI浏览器插件。 我们有第三方的输入设备,为我们提供 音频以Opus "帧 "的形式存在。 我们使用二进制WebSockets将这些帧传送到浏览器,然后,将数据转发给我们的NPAPI插件进行解码和音频播放。 见图。

Audio flow

考虑到这些要求,我们应该采取什么样的方法,用一个类似HTML5的解决方案来取代NPAPI插件?

  1. 将端到端延迟最小化到不超过3-5s(假设往返网络延迟200mS)。
  2. 提供应用音频过滤器的方法(客户端浏览器端)。

使用html5音频标签似乎会带来巨大的延迟,因为各种浏览器在开始播放之前都需要一定的缓冲时间(15-30s的音频)。 我们理解Opus可能会或可能不会在所有浏览器上得到支持。 如果需要的话(虽然我们宁愿不减少带宽),我们可以在将数据发送到浏览器之前,将Opus帧封装到Web服务中的Ogg容器中。 看看html5rocks的一个演示。HTML5音频游乐场貌似#2是可能的。

如果在这里问这样的设计问题不合适,请建议其他论坛组可能更合适。

谢谢您的任何帮助或建议。

javascript html audio html5-audio audio-streaming
2个回答
1
投票

由于你需要自己管理所有的缓冲和什么的,我认为最好的选择是在JavaScript中实际解码Opus帧。 作为奖励,你会得到更好的浏览器支持。

Aurora.js项目就有这方面的支持。 https:/github.comaudiocogsopus.js。 虽然现阶段还有点实验性。

如果你不需要使用Opus和WebSocket,你会有更多的选择。 标准版 <audio> 在大多数情况下,标签不需要超过几秒钟的音频缓冲区来开始播放。 当它这样做,它通常是因为内容类型头是错误的,播放器软件必须找出它是什么,需要一个更大的缓冲区工作。 或者,有一些其他的同步问题。


0
投票

我也有类似的情况。我一直使用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#代码 从零开始,基于WebMMatroskaEBML 规格。当通过HTTP服务时,它在Chrome和Firefox中正确播放,但VLC似乎无法通过HTTP流式传输OpusWebM。至少Chrome要求时间序列从0开始,所以在服务器端打包并不是一个好的选择,因为这需要对分发系统进行修改。

最后,我 将其移植到JavaScript中 这样,每个客户端都可以将Opus帧打包到WebM中,时间戳从0开始,这样就可以在Chrome和Firefox中一秒内启动直播,而无需预缓冲。请注意,我在传入的websocket数据包上使用了4个字节的头,因为现有的分发系统并不保留数据包边界(它是为MP3流构建的)。如果你在每个opus帧中使用一个websocket帧,并且每帧使用固定数量的样本,你可以删除这个头。

现在剩下的就是为IE11、Safari和一些旧的移动浏览器找到一个解决方案......。

© www.soinside.com 2019 - 2024. All rights reserved.