【问题标题】:Does v4l2 support multi-map?v4l2 是否支持多地图?
【发布时间】:2015-11-20 15:54:42
【问题描述】:

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

在线搜索,我发现允许多次打开视频设备,但是当我在成功v4l2_open 后的第二个过程中尝试映射(尝试了v4l2_mmap 和只是mmap)时,我得到了EINVAL 错误。

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

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

【问题讨论】:

    标签: linux v4l2


    【解决方案1】:

    multi-consumer mmap 的主要问题是这需要在设备驱动端实现。也就是说:即使某些设备可能支持多地图,其他设备可能不支持。

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

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

    顺便说一句,您不需要多个进程来保持代码模块化。 多个进程各有优点(例如特权分离、崩溃恢复等),但也可能鼓励代码重复...

    【讨论】:

      【解决方案2】:

      这可能与现在无关.....

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-21
        • 2013-09-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多