v4l2是否支持多地图?

时间:2015-11-20 15:54:42

标签: linux v4l2

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

在线搜索,我发现允许多次打开视频设备,但是当我尝试在成功后{v4l2_mmapmmap中尝试映射(同时尝试v4l2_openEINVAL) 1}},我收到EINVAL错误。

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

注意:我想保持代码模块化,因此需要两个进程。如果这是不可能的,那么仍然可以在单个进程(多线程和全局帧缓冲区)中完成所有工作。 使用标准共享内存函数调用是不可能的,因为这两个进程必须映射到视频设备文件(/dev/shm),而我无法在JOptionPane.showInputDialog(...)下进行调用。

2 个答案:

答案 0 :(得分:0)

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

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

因此,在任何情况下,您的应用程序都应提供处理非多地图设备的方法。

顺便说一下,您不需要多个进程来保持代码模块化。 多个进程有其优点(例如,私密性分离,崩溃恢复能力......),但也可能鼓励代码重复...

答案 1 :(得分:0)

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

您不需要使用完整的monty multi consumer事物来执行此操作。我使用Python将mmap缓冲区的处理交给多个进程(python多线程一次只允许1个线程执行)

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

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