mmap: Invalid argument
时间: 2023-08-07 18:18:54 浏览: 206
如果你在运行上述代码时遇到 `mmap: Invalid argument` 的错误,可能是由于视频设备的分辨率不支持程序中设置的分辨率所导致的。
你可以尝试修改 `IMAGE_WIDTH` 和 `IMAGE_HEIGHT` 的值为你的摄像头支持的分辨率,或者使用以下代码查询摄像头支持的分辨率:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <linux/videodev2.h>
#define DEVICE "/dev/video0"
int main(int argc, char **argv) {
int fd = 0;
struct v4l2_capability cap;
struct v4l2_fmtdesc format;
struct v4l2_frmsizeenum framesize;
int ret = 0;
// 打开视频设备
fd = open(DEVICE, O_RDWR);
if (-1 == fd) {
perror("open");
return errno;
}
// 查询设备能力
ret = ioctl(fd, VIDIOC_QUERYCAP, &cap);
if (-1 == ret) {
perror("ioctl(VIDIOC_QUERYCAP)");
return errno;
}
// 打印支持的格式
printf("Supported formats:\n");
memset(&format, 0, sizeof(format));
format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
while (0 == ioctl(fd, VIDIOC_ENUM_FMT, &format)) {
printf("\t%s\n", format.description);
format.index++;
}
// 打印支持的分辨率
printf("Supported framesizes:\n");
memset(&framesize, 0, sizeof(framesize));
framesize.pixel_format = V4L2_PIX_FMT_YUYV;
while (0 == ioctl(fd, VIDIOC_ENUM_FRAMESIZES, &framesize)) {
if (framesize.type == V4L2_FRMSIZE_TYPE_DISCRETE) {
printf("\t%dx%d\n", framesize.discrete.width, framesize.discrete.height);
}
framesize.index++;
}
// 关闭设备
close(fd);
return 0;
}
```
该代码能够打印出摄像头支持的格式和分辨率,你可以根据打印结果修改程序中的分辨率设置,或者手动调整摄像头的分辨率。
阅读全文