在浏览器中显示本地gstreamer流

3 投票
2 回答
6831 浏览
提问于 2025-04-16 04:01

我有一个摄像头的画面通过V4l2接口传输到一台Linux机器上,这个画面是用来建立一个gstreamer管道的。我正在搭建一个界面来控制这个摄像头,想用HTML和JavaScript来实现,并与本地服务器进行通信。现在的问题是,如何把gstreamer管道中的画面传输到浏览器里。看起来有以下几种方法:

  • 从gstreamer回传到一个v4l2设备,然后用Flash的摄像头支持来显示
  • 输出一个MJPEG流,在浏览器中显示
  • 输出一个RTSP流,通过Flash来显示
  • 编写一个浏览器插件
  • 在浏览器上覆盖一个本地的X应用程序

有没有人之前遇到过这个问题并解决过?最重要的要求是画面尽量接近实时。我希望尽量避免使用Flash,虽然可能不太容易。任何帮助都将非常感谢。

2 个回答

0

你想支持哪些浏览器呢?如果不考虑Internet Explorer(IE),那么你可以直接用标签在浏览器里播放OGG/Theora视频或者WebM视频。不过,如果你也需要支持IE的话,可能就只能用Flash小程序了。我刚刚用Flumotion和Flowplayer的免费版本设置了一个网络直播,效果非常好。Flowplayer有很多高级功能,我还没来得及深入了解呢。

1

你已经考虑了多种解决方案。你也可以把音频和视频流通过ogg/vorbis/theora或vp8格式传输到icecast服务器上,具体可以参考OLPC GStreamer的维基页面,里面有很多例子。

既然你也在寻找Python的解决方案(根据你的标签),你有没有考虑过使用Flumotion?这是一个基于GStreamer和Twisted构建的流媒体服务器,你可以把它和自己的方案结合起来。它可以通过HTTP进行流媒体传输,所以你不需要icecast服务器。

根据不同的编码格式,有一些调整可以帮助你实现低延迟。通常情况下,使用Flumotion的话,本地的延迟可以达到几秒钟,我相信这个是可以进一步降低的(x264enc可以调整到低于一秒的延迟,没记错的话)。一般来说,你需要减少关键帧的间隔,并且限制运动向量的估计只考虑附近的几帧:不过这样可能会降低视频质量并提高比特率。

撰写回答