gpt4 book ai didi

python - 如何找到导致 [Errno 22] Invalid argument 异常的 mmap 参数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:40:43 26 4
gpt4 key购买 nike

我正在尝试为 V4L 相机分配一个小缓冲区,但我收到了

mmap.error: [Errno 22] Invalid argument

您能否建议如何调试并找出哪个是无效参数,以便mmap 成功?


MCVE代码:

from __future__ import print_function

import fcntl
import mmap
import os
import psutil
import v4l2


def alocate_buf(buf):
print("Trying to allocate a buffer of size {}".format(buf.length))
print("vd.fileno():", vd.fileno(), type(vd.fileno()))
print("buf.length:", buf.length, type(buf.length))
print("buf.m.offset:", buf.m.offset, type(buf.m.offset))
mm = mmap.mmap(vd.fileno(), buf.length, mmap.MAP_SHARED, mmap.PROT_READ | mmap.PROT_WRITE, offset=buf.m.offset)


if __name__ == "__main__":
mem = psutil.virtual_memory()
print("available memory:", mem.available)

vd = open("/dev/video3", 'rb+', buffering=0)

buf = v4l2.v4l2_buffer()
buf.type = v4l2.V4L2_BUF_TYPE_VIDEO_CAPTURE
buf.memory = v4l2.V4L2_MEMORY_MMAP
buf.index = 0
buf.length = 1024

alocate_buf(buf)

代码运行:

$ python find_max_mmap.py
available memory: 6439845888
Trying to allocate a buffer of size 1024
vd.fileno(): 3 <type 'int'>
buf.length: 1024 <type 'long'>
buf.m.offset: 0 <type 'long'>
Traceback (most recent call last):
File "find_max_mmap.py", line 30, in <module>
alocate_buf(buf)
File "find_max_mmap.py", line 15, in alocate_buf
mm = mmap.mmap(vd.fileno(), buf.length, mmap.MAP_SHARED, mmap.PROT_READ | mmap.PROT_WRITE, offset=buf.m.offset)
mmap.error: [Errno 22] Invalid argument

环境:

  • 操作系统:Ubuntu 16.04、Linux 4.4.0-64-generic、#85-Ubuntu SMP x86_64 GNU/Linux
  • UVC 设备:Intel RealSense 410


编辑 1:

请注意,将相关行更改为:

mm = mmap.mmap(vd.fileno(), buf.length)

仍然给出:

$ python mmap_SO.with_0.py
available memory: 6418022400
Trying to allocate a buffer of size 0
vd.fileno(): 3 <type 'int'>
buf.length: 0 <type 'long'>
buf.m.offset: 0 <type 'long'>
Traceback (most recent call last):
File "mmap_SO.with_0.py", line 30, in <module>
alocate_buf(buf)
File "mmap_SO.with_0.py", line 15, in alocate_buf
mm = mmap.mmap(vd.fileno(), buf.length)
mmap.error: [Errno 22] Invalid argument

最佳答案

我自己没有使用过 Python v4l2 模块,但是在测试 MMAP 与 USERPTR 分配方法时,我首先确实遇到了 EINVAL。我的问题原来是我没有在对该文件描述符调用 mmap() 之前设置图像格式。

鉴于我在您的代码中没有看到任何 v4l2_format()fnctl.ioctl(vd, VIDIOC_S_FORMAT, ...) 的构造,这似乎很可能也是你的问题。如果您尝试设置格式,您仍然会得到 EINVAL 吗?

为确保您指定的分辨率和像素格式与/dev/video3 兼容,您可以通过 guvcview 或其他网络摄像头工具进行检查。

关于python - 如何找到导致 [Errno 22] Invalid argument 异常的 mmap 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43095668/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com