2015-11-20 128 views
0

我试图在两个进程之间共享从USB摄像头(Logitech c270)接收的帧(图像),以便我可以避免memcpy。我使用内存映射流I/O方法描述here,我可以在使用v4l2_mmap后成功从相机获取帧。但是,我有另一个进程(用于图像处理),它必须在出队后使用图像缓冲区,并通知第一个进程再次对缓冲区进行排队。v4l2是否支持多图?

网上搜索,我能找到打开视频设备多次是允许的,但是当我尝试映射成功v4l2_open后(尝试都v4l2_mmap,只是mmap)在第二过程中,我得到一个EINVAL错误。

我找到了this pdf,它讨论了在v4l2(非官方)中实现多图的问题,并且想知道这是否实现。我也尝试过使用用户指针流I/O方法,其中的文档明确指出可以在此方法中实现共享内存,但当我请求缓冲区时,我得到一个EINVAL(根据linuxtv.org中的文档,这意味着相机不支持用户指针流式I/O)。

注:我想保持代码模块化,因此有两个过程。如果这是不可能的,则在单个进程中完成所有工作(多线程&全局帧缓冲区)仍然是可能的。 使用标准共享内存函数调用是不可能的,因为这两个进程必须映射到视频设备文件(/dev/video0),我不能在/dev/shm之下。

回答

0

多用户mmap的主要问题是这需要在设备驱动程序端执行。即:即使某些设备可能支持多地图,其他设备也可能不支持。

所以,除非您可以控制与您的应用程序一起使用的相机,否则最终会遇到一个不适用的相机,在这种情况下,您的应用程序将无法工作。

因此,无论如何,您的应用程序应该提供处理非多地图设备的方法。

顺便说一句,你不需要多个进程来保持你的代码模块化。 多进程有其优点(例如privilige分离,防撞弹性,...),但也可能鼓励重复代码...

0

这可能不是现在相关.....

你不”不需要使用完整的多用途消费者来做到这一点。我已经使用Python将mmap缓冲区的处理交给多个进程(python多线程一次只允许1个线程执行)

如果你正在运行多线程,那么工作线程可以拿起缓冲区并在主线程触发时独立处理它

由于代码显然非常pythonesq我不会在这里发布它,因为它在其他语言中没有意义,因为它使用python多处理支持。