linux - v4l2 是否支持多 map ?

标签 linux v4l2

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

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

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

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

最佳答案

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

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

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

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

关于linux - v4l2 是否支持多 map ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33830865/

相关文章:

linux - 如何从当前机器获取 HTTP referer?

c++ - 如何在 Linux 中提高 SSD I/O 吞吐量并发性

c - make后出现意外的rm

opencv - 在 Linux 上使用 OpenCV 捕获多个网络摄像头 (uvcvideo)

c - SIGKILL 后如何进行清理?

c - 使用多线程的套接字服务器或文件服务器实现 : concept not clear

linux - 如何将 mjpeg 从网络摄像头更改为 yuyv422 到 v4l2loopback?

python - v4l2 fcntl.ioctl VIDIOC_S_PARM 用于设置相机捕获的 fps 和分辨率

linux - 如何检测我的网络摄像头支持哪种像素格式?

linux - V4L2 帧上的系统偏移