别摸我的键盘 的学生作业:
#include
#include
#include
#include
#include
#include
#include
void print_frame_sizes(int fd, unsigned int pixel_format)
{
struct v4l2_frmsizeenum frmsize;
memset(&frmsize, 0, sizeof(frmsize));
frmsize.pixel_format = pixel_format;
printf("===== 支持的帧尺寸 =====\n");
for (frmsize.index = 0; ioctl(fd, VIDIOC_ENUM_FRAMESIZES, &frmsize) == 0; frmsize.index++)
{
if (frmsize.type == V4L2_FRMSIZE_TYPE_DISCRETE)
{
printf("分辨率: %dx%d\n",
frmsize.discrete.width, frmsize.discrete.height);
}
else if (frmsize.type == V4L2_FRMSIZE_TYPE_STEPWISE)
{
printf("分辨率范围: %dx%d 到 %dx%d (步长 %d)\n",
frmsize.stepwise.min_width, frmsize.stepwise.min_height,
frmsize.stepwise.max_width, frmsize.stepwise.max_height,
frmsize.stepwise.step_width);
}
}
}
int main(int argc, char const *argv[])
{
int ret = 0;
int fd = open("/dev/video0", O_RDWR);
struct v4l2_capability cap = {0};
ioctl(fd, VIDIOC_QUERYCAP, &cap);
// 相机的能力集
// Width/Height
printf("===== 获取相机的能力集 =====\n");
printf("cap.driver = %s \n", cap.driver); // 驱动名,通常是uvcvideo
printf("cap.card = %s \n", cap.card); // Device名,厂商定制
printf("cap.bus_info = %s \n", cap.bus_info); // 总线信息
printf("cap.version = %d \n", cap.version); // 内核版本
printf("cap.capabilities = %x \n", cap.capabilities); // 所有能力集
printf("cap.device_caps = %x \n", cap.device_caps); // 开放能力集
printf("cap.reserved = %x \n", cap.reserved); // 保留
// 获取相机支持的格式信息
struct v4l2_fmtdesc fmt = {
.index = 0, // 第0种支持的格式.
.type = V4L2_BUF_TYPE_VIDEO_CAPTURE, // 拍照模式下.
};
printf("===== 获取相机支持的格式信息 =====\n");
while ((ret = ioctl(fd, VIDIOC_ENUM_FMT, &fmt)) == 0)
{
printf("{pixelformat = %c%c%c%c},description = '%s'\n",
fmt.pixelformat & 0xff,
(fmt.pixelformat >> 8) & 0xff,
(fmt.pixelformat >> 16) & 0xff,
(fmt.pixelformat >> 24) & 0xff,
fmt.description);
fmt.index++;
};
// 打印支持的帧尺寸(分辨率)
struct v4l2_fmtdesc fmtdesc;
memset(&fmtdesc, 0, sizeof(fmtdesc));
fmtdesc.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmtdesc.index = 0;
if (ioctl(fd, VIDIOC_ENUM_FMT, &fmtdesc) == 0) {
print_frame_sizes(fd, fmtdesc.pixelformat);
}
return 0;
}