使用V4L2在Android上采集视频时,你得到的所有数据0(get all 0 data when

2019-10-18 19:13发布

我试图捕获视频在Android上使用V4L2下JNI。 我发现了一些导向件和随后步骤:

fd = open("/dev/video0", O_RDWR);

/* init part */
ioctl(fd, VIDIOC_QUERYCAP, &caps);
ioctl(fd, VIDIOC_ENUM_FMT, &fmtdesc);
ioctl(fd, VIDIOC_S_FMT, &fmt);
ioctl(fd, VIDIOC_REQBUFS, &req);
ioctl(fd, VIDIOC_QUERYBUF, &buf);
ioctl(fd, VIDIOC_QBUF, &buf);

/* capture part */
FILE *fp = fopen("/sdcard/img.yuv", "wb");
for (i = 0; i < 20; i++)
{
    ioctl(fd, VIDIOC_DQBUF, &buf);
    fwrite(buffers[buf.index].start, 1, buf.bytesused, fp);
    ioctl(fd, VIDIOC_QBUF, &buf);
}
fclose(fp);

这是我的代码的主要结构。 所有功能正常运行,并返回0。但是,当我打开二进制浏览器的输出文件,我发现所有的数据为0。

有没有我的代码什么问题? 我弄糊涂了,因为所有的函数返回0。

谢谢!!

Answer 1:

您正在使用所谓的缓冲区[]数组。 但我不能看到它的声明或代表的一切。 如果没有上面的代码丢失,你总是会得到0使得你正在写缓冲区[]的文件,而不是你用v412得到的东西。 进一步,帽子,fmtdesc,FMT,REQ和BUF的ioctl命令之前的初始值将是有趣了。 根据他们的inital值,你将有不同的通信接口。 问题可能会被隐藏在这些地区。

当你在你的问题中写道,所有的ioctl命令将返回0,应该没有错误。 如果一切按预期运行。 检查问题的另一种方法是调用

perror("<your comment or hint to line above>");

之后的每个ioctl命令。 这将打印您提供上STD-出错误的详细信息。 (可在此线程中找到有关PERROR更多的细节什么时候应该使用PERROR(“...‘)和fprintf(错误,’...”)? )

你想从摄像机的图像? 在部分Android设备上的相机必须使用其他设备驱动程序除了videoXY复杂的程序启动(在你上面使用的是背凸轮某些手机video0的)。 并试图同时官方相机应用程序正在运行可能难以从video0的获取图像。 这位官员用v412阿比说:

v412驱动不应该支持多个应用程序读取或通过复制缓冲剂,时间复用或类似装置写一个设备对相同的数据流。 这是更好地在用户空间的代理应用程序进行处理。

来源: http://linuxtv.org/downloads/v4l-dvb-apis/common.html#idp18553208

你能发布更多(详细)代码? 我也许能帮助,因为我做的非常相似的东西。

为了能够重现它,这将是非常有趣的与Android设备正在处理(类型/型号/ Android版本)。



文章来源: get all 0 data when capture video using v4l2 on android