5

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

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

我愿意使用 vlc、gstreamer 或任何其他我不知道的通用压缩库。

谢谢!

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

4

3 回答 3

2

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

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

于 2010-01-15T14:15:48.390 回答
1

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

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

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

于 2010-01-14T01:38:16.477 回答
0

当您说“新视频端口”然后开始谈论 vlc/gstreaming 时,我发现很难弄清楚您想要什么。显然,这些软件包将有助于通过多种协议进行流式传输和压缩,但显然您需要一个“网络端口”而不是“视频端口”来发送流式传输。

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

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

在客户端,我认为您会发现许多小部件可以在 GTK 中处理视频。在担心界面细节之前,我会先研究一下。

于 2010-01-14T01:39:23.660 回答