流音频和视频到浏览器

时间:2020-06-22 13:57:06

标签: c++ audio video browser containers

对于我的一个项目(在C ++,Linux中),我正在寻找一种轻量级的方法(在CPU上,也可以在没有硬件加速的类似raspberry pi的系统上运行)将视频+音频流传输到Web浏览器。

仅对于视频,mjpeg可在所有主流浏览器上使用。

根据https://caniuse.com/#search=mpeg4,我应该将mpeg4用于视频和音频,不幸的是mpeg4不是轻量级的。 一个替代方案可以是matroska容器,但在Apple上仅受vp8支持,这也很重(?)。

所以我正在寻找使用建议。该平台的主要浏览器在Linux,Mac和Windows上都支持该功能。带宽的使用次要。

1 个答案:

答案 0 :(得分:1)

解决方案取决于您要查找服务器端还是客户端。

换句话说,以树莓派PI为例,您是想让PI成为提供视频的流服务器还是正在播放视频的主机。

以PI为例,对于PI是流服务器的情况,则有几种选择。

您可以将PI设置为简单的静态文件服务器并以这种方式提供MP4服务,或者可以使用多种可用的开放源代码和第三方流服务器解决方案,这些解决方案允许PI提供媒体服务器功能。一些例子:

对于PI在回放侧的情况,则PI文档(https://www.raspberrypi.org/documentation/raspbian/applications/omxplayer.md)中记录了本机播放器:

  • omxplayer /opt/vc/src/hello_pi/hello_video/test.h264

对于将摄像机安装在设备上或连接到设备的情况,摄像机解决方案本身通常将支持编码为常用格式。

例如,Raspberry PI摄像机解决方案支持h.264编码,并利用PI上的HW编码-有关更多信息,请参见此处:

要了解这如何影响您的解决方案性能要求,有必要查看视频的编码和传输方式。较高的步骤是:

  • 每帧捕获的原始像素位图
  • 原始像素编码(例如h.264编码)
  • 将已编码的视频流(有时称为“多路复用”)打包到带有音频流,字幕等的容器(例如mp4容器)中
  • 对于更高级的多用户流服务,还可以使用ABR流,并将容器分成“块”或用于流的段(在使用HLS流格式的iOS上)。

从图表上大致如此:

enter image description here

上面最耗费处理器资源的步骤通常是编码步骤-作为一个非常粗略的经验法则,假设您正在寻找高质量的视频流,则编码器提供的压缩程度越高,文件或流的大小就越小,开销越高。

如果我们再次以PI为例,则PI具有H.264编码的硬件支持,默认的Camera SW将利用此支持为您尽可能高效地进行编码-即以最小的处理开销。

对您而言,最有效的解决方案可能取决于特定设备“本地”支持的编解码器-即,利用设备上的硬件。 H.264是一种非常常见的编解码器,它还具有以下优点:大多数播放视频的客户端设备通常也都将支持它(此时)。

如果您说“无硬件加速”时不想使用此本机支持,那么您可能会寻找可以找到的最低处理开销编解码器。这可能不是压缩率最高或支持最广泛的一种,但是对编解码器的一些研究专门针对低处理量而设计,例如

这个Netflix技术博客也值得一看:

最后,仅添加最后一个复杂功能(对不起!),可能是编码开销小的解决方案实际上是解码开销很大的情况,因此您可能需要检查所选的解决方案是否也适用为您的最终用户设备。