当前位置: 首页 > 知识库问答 >
问题:

v4l2支持多映射吗?

毋宪
2023-03-14

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

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

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

注意:我希望代码保持模块化,因此有两个过程。如果这是不可能的,在一个进程(多个线程)中完成所有工作

共有2个答案

党源
2023-03-14

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

您不需要使用完整的monty multi-consumer工具来实现这一点。我使用Python将mmap缓冲区的处理交给多个进程(Python多线程一次只允许执行一个线程)

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

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

傅朗
2023-03-14

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

因此,除非您能够控制应用程序中使用的摄像头,否则最终您将遇到一个无法控制的摄像头,在这种情况下,您的应用程序将无法工作。

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

顺便说一句,您不需要多个进程来保持代码模块化。多个过程各有其优点(例如,私密分离、碰撞恢复能力等),但也可能会鼓励代码重复。。。

 类似资料:
  • 我正在尝试使用Flink的SQL API从地图访问密钥。它失败,线程“main”组织中出现错误异常。阿帕奇。Flink。桌子应用程序编程接口。TableException:不支持类型:任何请告知我如何修复它。这是我的活动课 这是提交flink作业的主类 当我运行它时,我得到了例外 我正在使用flink 1.3.1

  • 我正在为Raspbian(Raspberry Pi 2)中的Python编写视频捕获脚本,我在使用v4l2的Python绑定时遇到了麻烦,因为我在内存映射缓冲区方面没有成功。 我所需要的: 从高清网络摄像头捕获视频(稍后将同时捕获其中两个) 我所尝试的: 使用OpenCV(cv2)。它很容易使用,但是它增加了很多处理负载,因为它将网络摄像头的JPEG帧转换为原始图像,然后我必须在通过WLAN发送它

  • 我试图通过Python在Elasticsearch中创建一个索引。我部署了一个ES的本地实例,查询运行良好。但是,我有一个模式。这里是: 下面是我用来创建这个索引的代码

  • 支持 PEP 484 键入批注以及 Mypy 类型检查工具。 注解 Mypy插件和键入注释应该被视为 Alpha级别 用于SQLAlChemy的早期1.4版本。该插件尚未在真实场景中进行测试,可能存在许多未处理的情况和错误情况。新类型存根的详细信息还包括 如有更改,可随时更改 在1.4系列期间。 安装 Mypy插件依赖于打包在 sqlalchemy2-stubs 。这些存根必须完全替换以前的 sq

  • persistenceException:DB2 SQL错误:sqlcode=-206,sqlstate=42703,sqlerrmc=t0.id,driver=3.52.95{prepstmnt 1029586270