v4l2 是否支持多地图?
Does v4l2 support multi-map?
我正在尝试在两个进程之间共享从 USB 摄像头 (logitech c270) 接收到的帧(图像),这样我就可以避免 memcpy
。我正在使用 here 描述的内存映射流 I/O 方法,在使用 v4l2_mmap
后我可以从相机成功获取帧。但是,我有另一个进程(用于图像处理),它必须在出队后使用图像缓冲区并向第一个进程发出信号以再次对缓冲区进行排队。
在网上搜索,我发现允许多次打开视频设备,但是当我尝试在成功后的第二个过程中尝试映射(v4l2_mmap
和mmap
)时v4l2_open
,我收到 EINVAL
错误。
我找到了 this pdf,其中讨论了在 v4l2 中实现多地图(非官方),想知道是否已实现。我也尝试过使用用户指针流 I/O 方法,该方法的文档明确指出可以在此方法中实现共享内存,但是当我请求缓冲区时我得到了 EINVAL
(根据linuxtv.org
中的文档这意味着相机不支持用户指针流 I/O)。
注意:我想保持代码模块化,因此有两个过程。如果这不可能,在单个进程(多线程和全局帧缓冲区)中完成所有工作仍然是可能的。
使用标准共享内存函数调用是不可能的,因为这两个进程必须映射到视频设备文件 (/dev/video0
) 而我不能在 /dev/shm
.
下使用它
多消费者mmap的主要问题是这需要在设备驱动端实现。也就是说:即使某些设备可能支持多地图,但其他设备可能不支持。
因此,除非您可以控制与您的应用程序一起使用的相机,否则您最终会遇到无法控制的相机,在这种情况下,您的应用程序将无法运行。
所以无论如何,您的应用程序应该提供处理非多地图设备的方法。
顺便说一句,您不需要多个进程来保持您的代码模块化。
多个进程各有优点(例如权限分离、崩溃恢复能力……),但也可能鼓励代码重复……
现在可能不相关.....
您不需要使用完整的 monty 多消费者工具来执行此操作。我已经使用 Python 将 mmap 缓冲区的处理交给多个进程(python 多线程一次只允许 1 个线程执行)
如果您是 运行 多线程,那么工作线程可以在主线程触发时获取缓冲区并独立处理它
因为代码显然非常 pythonesq 我不会在这里 post 因为它在其他语言中没有意义,因为它使用 python 多处理支持.
我正在尝试在两个进程之间共享从 USB 摄像头 (logitech c270) 接收到的帧(图像),这样我就可以避免 memcpy
。我正在使用 here 描述的内存映射流 I/O 方法,在使用 v4l2_mmap
后我可以从相机成功获取帧。但是,我有另一个进程(用于图像处理),它必须在出队后使用图像缓冲区并向第一个进程发出信号以再次对缓冲区进行排队。
在网上搜索,我发现允许多次打开视频设备,但是当我尝试在成功后的第二个过程中尝试映射(v4l2_mmap
和mmap
)时v4l2_open
,我收到 EINVAL
错误。
我找到了 this pdf,其中讨论了在 v4l2 中实现多地图(非官方),想知道是否已实现。我也尝试过使用用户指针流 I/O 方法,该方法的文档明确指出可以在此方法中实现共享内存,但是当我请求缓冲区时我得到了 EINVAL
(根据linuxtv.org
中的文档这意味着相机不支持用户指针流 I/O)。
注意:我想保持代码模块化,因此有两个过程。如果这不可能,在单个进程(多线程和全局帧缓冲区)中完成所有工作仍然是可能的。
使用标准共享内存函数调用是不可能的,因为这两个进程必须映射到视频设备文件 (/dev/video0
) 而我不能在 /dev/shm
.
多消费者mmap的主要问题是这需要在设备驱动端实现。也就是说:即使某些设备可能支持多地图,但其他设备可能不支持。
因此,除非您可以控制与您的应用程序一起使用的相机,否则您最终会遇到无法控制的相机,在这种情况下,您的应用程序将无法运行。
所以无论如何,您的应用程序应该提供处理非多地图设备的方法。
顺便说一句,您不需要多个进程来保持您的代码模块化。 多个进程各有优点(例如权限分离、崩溃恢复能力……),但也可能鼓励代码重复……
现在可能不相关.....
您不需要使用完整的 monty 多消费者工具来执行此操作。我已经使用 Python 将 mmap 缓冲区的处理交给多个进程(python 多线程一次只允许 1 个线程执行)
如果您是 运行 多线程,那么工作线程可以在主线程触发时获取缓冲区并独立处理它
因为代码显然非常 pythonesq 我不会在这里 post 因为它在其他语言中没有意义,因为它使用 python 多处理支持.