在浏览器中显示本地gstreamer流
我有一个摄像头的画面通过V4l2接口传输到一台Linux机器上,这个画面是用来建立一个gstreamer管道的。我正在搭建一个界面来控制这个摄像头,想用HTML和JavaScript来实现,并与本地服务器进行通信。现在的问题是,如何把gstreamer管道中的画面传输到浏览器里。看起来有以下几种方法:
- 从gstreamer回传到一个v4l2设备,然后用Flash的摄像头支持来显示
- 输出一个MJPEG流,在浏览器中显示
- 输出一个RTSP流,通过Flash来显示
- 编写一个浏览器插件
- 在浏览器上覆盖一个本地的X应用程序
有没有人之前遇到过这个问题并解决过?最重要的要求是画面尽量接近实时。我希望尽量避免使用Flash,虽然可能不太容易。任何帮助都将非常感谢。
2 个回答
你想支持哪些浏览器呢?如果不考虑Internet Explorer(IE),那么你可以直接用标签在浏览器里播放OGG/Theora视频或者WebM视频。不过,如果你也需要支持IE的话,可能就只能用Flash小程序了。我刚刚用Flumotion和Flowplayer的免费版本设置了一个网络直播,效果非常好。Flowplayer有很多高级功能,我还没来得及深入了解呢。
你已经考虑了多种解决方案。你也可以把音频和视频流通过ogg/vorbis/theora或vp8格式传输到icecast服务器上,具体可以参考OLPC GStreamer的维基页面,里面有很多例子。
既然你也在寻找Python的解决方案(根据你的标签),你有没有考虑过使用Flumotion?这是一个基于GStreamer和Twisted构建的流媒体服务器,你可以把它和自己的方案结合起来。它可以通过HTTP进行流媒体传输,所以你不需要icecast服务器。
根据不同的编码格式,有一些调整可以帮助你实现低延迟。通常情况下,使用Flumotion的话,本地的延迟可以达到几秒钟,我相信这个是可以进一步降低的(x264enc可以调整到低于一秒的延迟,没记错的话)。一般来说,你需要减少关键帧的间隔,并且限制运动向量的估计只考虑附近的几帧:不过这样可能会降低视频质量并提高比特率。