从多个来源流式传输视频

时间:2010-01-14 01:11:12

标签: c++ gtk robotics vlc v4l2

我想了解一些人如何解决这个问题。 我有一个机器人,运行linux并使用网络摄像头(带有v4l2驱动程序)作为其传感器之一。我用gtkmm写了一个控制面板。服务器和客户端都是用C ++编写的。服务器是机器人,客户端是“控制面板”。图像分析正在机器人上进行,我想将视频从摄像机流回控制面板有两个原因: A)为了好玩 B)叠加图像分析结果

所以我的问题是,有什么好的方法可以将视频从网络摄像头传输到控制面板,并优先使用机器人代码来处理它?我对编写自己的视频压缩方案并将其放入现有的网络端口感兴趣,我认为新的网络端口(专用于视频数据)是最好的。问题的第二部分是如何在gtkmm中显示视频?视频数据是异步到达的,我无法控制gtkmm中的main(),所以我觉得这很棘手。

我愿意使用像vlc,gstreamer或任何其他我不了解的通用压缩库这样的东西。

谢谢!

编辑: 机器人有一个1GHz的处理器,运行像Linux版本的桌面,但没有X11。

3 个答案:

答案 0 :(得分:2)

Gstreamer只需很少的努力即可为您解决所有这些问题,并且还可以很好地与Glib事件系统集成。 GStreamer包括V4L源插件,gtk +输出小部件,用于调整大小/编码/解码视频的各种过滤器,以及最重要的网络接收器和源,用于在机器之间移动数据。

对于原型,您可以使用'gst-launch'工具来组合视频管道并测试它们,然后在代码中以编程方式创建管道非常简单。搜索“GStreamer网络流媒体”,查看人们使用网络摄像头等进行此操作的示例。

答案 1 :(得分:1)

我不确定所使用的实际技术,但如果你想避免丢帧,这最终会成为一个巨大的同步。我正在同时将视频流式传输到文件和网络。我最终做的是使用一个带有三个指针的大循环缓冲区:一个写入和两个读取。有三个控制线程(以及一些额外的编码线程):一个写入缓冲区,如果它到达缓冲区中的某个点而没有被其他两个读取,则会暂停,两个读取器线程将从缓冲区读取并写入文件/网络(如果他们领先于制作人,则暂停)。由于所有内容都是以帧的形式写入和读取的,因此可以将同步开销保持在最低限度。

我的制作人是一个转码器(来自另一个文件源),但在你的情况下,你可能希望相机以通常的格式生成整帧,并且只为服务器进行转码(类似于ffmpeg),机器人处理图像时。

你的问题有点复杂,因为机器人需要实时反馈,因此无法暂停并等待流媒体服务器赶上。因此,您可能希望尽可能快地将帧传送到控制系统,并将它们分别缓存在循环缓冲区中以便流式传输到“控制面板”。某些编解码器比其他编解码器更好地处理掉帧,所以如果网络落后,你可以开始覆盖缓冲区末尾的帧(注意它们没有被读取)。

答案 2 :(得分:0)

当你说'一个新的视频端口',然后开始讨论vlc / gstreaming时,我发现你很难找到你想要的东西。显然,这些软件包将通过多种协议协助流式传输和压缩,但显然您需要一个“网络端口”而不是“视频端口”来发送流。

如果你真正的意思是通过无线视频/电视馈送发送显示输出这是另一回事,那么你需要硬件专家而不是软件专家的建议。

继续前进。我已经通过MMS / UDP协议进行了大量的流式处理,vlc处理得非常好(作为服务器和客户端)。但它是专为台式机设计的,可能不像您想要的那么轻巧。我认为像gstreamer,mencoder或ffmpeg这样的东西会更好。机器人有什么样的CPU?如果你计划进行实时压缩,你需要一点点咕噜声。

在客户端,我认为你会找到一些小部件来处理GTK中的视频。在担心界面细节之前,我会先研究一下。