分辨率不能修改,只要修改以后,程序就会阻塞在 DQUEUE 这个命令中。伪代码如下:
int main()
{
int fd;
fd = open_camer_device();
init_camer_device(fd);
start_capturing(fd);
mainloop(fd);
/****************************************************************/
stop_capturing(fd);
uninit_camer_device(fd);
close_camer_device(fd);
/****************************************************************/
fd = open_camer_device();
init_camer_device(fd);/*这一句里面,设置了不同的参数*/
start_capturing(fd);
mainloop(fd);
stop_capturing(fd);
uninit_camer_device(fd);
close_camer_device(fd);
printf("ok\n");
return 0;
}
int init_camer_device(int fd)
{
struct v4l2_fmtdesc fmt;
struct v4l2_capability cap;
struct v4l2_format stream_fmt;
int ret;
static int iNum =0;
memset(&fmt,0,sizeof(fmt));
fmt.index = 0;
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
while((ret = ioctl(fd,VIDIOC_ENUM_FMT,&fmt)) == 0)
{
fmt.index ++ ;
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);
}
ret = ioctl(fd,VIDIOC_QUERYCAP,&cap);
if(ret < 0){
perror("FAIL to ioctl VIDIOC_QUERYCAP");
exit(EXIT_FAILURE);
}
if(!(cap.capabilities & V4L2_BUF_TYPE_VIDEO_CAPTURE))
{
printf("The Current device is not a video capture device\n");
exit(EXIT_FAILURE);
}
if(!(cap.capabilities & V4L2_CAP_STREAMING))
{
printf("The Current device does not support streaming i/o\n");
exit(EXIT_FAILURE);
}
stream_fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
** stream_fmt.fmt.pix.width = 680;
stream_fmt.fmt.pix.height = 480;
if(iNum == 1)
{
printf("aaaaaaaaaa");
stream_fmt.fmt.pix.width = 100;
stream_fmt.fmt.pix.height = 100;
}
iNum++;**
stream_fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
stream_fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;
if(-1 == ioctl(fd,VIDIOC_S_FMT,&stream_fmt))
{
perror("Fail to ioctl");
exit(EXIT_FAILURE);
}
init_mmap(fd);
return 0;
}
这个程序就是重复了两次,而且前后两次没有一点关系,是重新打开了摄像头,重新申请内核内存,重新映射,为啥改了分辨率,程序就会阻塞在select,也就是说,没有新的流进入缓冲区了。?