直接上代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <malloc.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <linux/videodev2.h>
int main()
{
int uvc_handle, ret, format;
struct v4l2_capability cap;
struct v4l2_format fmt;
printf("(%s,%d): Open video device \n",
__FUNCTION__, __LINE__);
uvc_handle = open("/dev/video0", O_RDWR | O_NONBLOCK, 0);
if (uvc_handle < 0) {
printf("(%s,%d): Open video device failed! \n",
__FUNCTION__, __LINE__);
goto fail;
}
printf("Before ioctl VIDIOC_QUERYCAP \n");
ret = ioctl(uvc_handle, VIDIOC_QUERYCAP, &cap);
if (ret) {
printf("(%s,%d): VIDIOC_QUERYCAP failed! \n",
__FUNCTION__, __LINE__);
goto fail;
}
if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) {
printf("(%s,%d): is no video capture device! \n",
__FUNCTION__, __LINE__);
goto fail;
}
if (!(cap.capabilities & V4L2_CAP_STREAMING)) {
printf("(%s,%d): does not support streaming i/o! \n",
__FUNCTION__, __LINE__);
goto fail;
}
/* Set resolution */
memset(&fmt, 0, sizeof(struct v4l2_format));
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.fmt.pix.width = 640;
fmt.fmt.pix.height = 480;
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
/* fmt.fmt.pix.field = V4L2_FIELD_INTERLACED; */
printf("Before ioctl VIDIOC_S_FMT \n");
ret = ioctl(uvc_handle, VIDIOC_S_FMT, &fmt);
if (ret < 0) {
printf("Open: VIDIOC_S_FMT Failed: %s", strerror(errno));
return ret;
}
printf("return normally \n");
return 0;
fail:
return 1;
}