获取所有0数据时捕获视频使用v4l2上android

我试图捕获在jni下使用v4l2 android上的视频。我发现了一些指导,并遵循了以下步骤:获取所有0数据时捕获视频使用v4l2上android

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.

谢谢!

回答:

您正在使用名为buffers []的数组。但是我看不到它在哪里宣布或它代表什么。如果上面没有代码缺失,你总是会得到零,因为你正在向文件写入buffer [],而不是你从v4l2获得的东西。 此外,ioctl命令之前的caps,fmtdesc,fmt,req和buf的初始值也会很有趣。根据他们的初始值,您将拥有不同的通信接口。问题可能隐藏在这些部分。

正如你在你的问题中写的,所有的ioctl命令都会返回0,应该没有错误。如果一切按预期行事。检查问题的另一种方法是在每个ioctl命令之后调用

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

。这会打印出更多关于std-out错误的信息。 (关于perror的更多细节可以在这个帖子中找到When should I use perror("...") and fprintf(stderr, "...")?)

你是否试图从相机中获取图像? (在某些手机上使用的video0是后视摄像头)在某些android设备上,摄像头必须通过使用除videoXY之外的其他设备驱动程序的复杂过程来启动。在正式相机应用程序运行时试图从video0获取图像可能会很困难。这位官员用v412阿比说:

v412驱动不应该支持多个应用程序读取或复制缓冲区,时间复用或者类似的方式写入设备上的同一数据流。这可以通过用户空间中的代理应用程序更好地处理。

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

你能发布更多(详细)代码?我可能会提供帮助,因为我做的事情非常类似。

为了能够重现它,你使用哪个Android设备(类型/型号/ android版本)会非常有趣。

以上是 获取所有0数据时捕获视频使用v4l2上android 的全部内容, 来源链接: utcz.com/qa/257516.html

回到顶部