Linux v4l2架构学习总链接
获取camera数据的过程简写如下

type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if (ioctl(fd, VIDIOC_STREAMON, &type) < 0)
printf ("VIDIOC_STREAMON failed\n");
int num = 0;
while (1)
{
FD_ZERO (&fds);
FD_SET(fd, &fds);
tv.tv_sec = 5;
tv.tv_usec = 0;
r = select (fd + 1, &fds, NULL, NULL, &tv);
if (-1 == r)
{
if (EINTR == errno)
continue;
printf ("select err\n");
}
if (0 == r)
{
fprintf (stderr, "select timeout\n");
exit (EXIT_FAILURE);
}
memset(&buf, 0, sizeof(buf));
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
if (ioctl (fd, VIDIOC_DQBUF, &buf) < 0)
printf("dqbuf fail\n");
fwrite(buffers[buf.index].start, buf.bytesused, 1, file_fd);
if (ioctl (fd, VIDIOC_QBUF, &buf) < 0)
printf("failture VIDIOC_QBUF\n");
num++;
if(num > atoi(argv[2]))
break;
}
测试命令
./v4l2_test /dev/video25 10 test.yuv
ubuntu下使用命令
ffplay -f rawvideo -video_size 1920x1080 -pix_fmt yuyv422 test.yuv
window下使用pyuv软件
图像显示如下

现在是输入源1,如果改成输入源3
inp.index = 3;
if (ioctl (fd, VIDIOC_S_INPUT, &inp) < 0) {
printf("Set input fail\n");
goto err;
}
显示效果如下


2248

被折叠的 条评论
为什么被折叠?



