Android平台USB视频输出功能求助!~~

[复制链接]
查看11 | 回复5 | 2021-1-27 05:06:26 | 显示全部楼层 |阅读模式
现在要实现一个USBCam功能,将摄像头采集到的实时图像数据,经过jpeg编码后,通过usbotg传输到PC端
现在模仿webcam(drivers/usb/gadget/webcam.c)
在Androidusb(drivers/usb/gadget/Android.c)上实现了一个UVCCamera驱动(添加到usbcomposite设备数组里)
USB连上PC后,在PC端可以被识别为uvccamera设备。
USB视频输出的应用程序,主要参照
http://git.ideasonboard.org/uvc-gadget.git/commit/9fbc003442056cdf59b87e94c1d0e3814575d4b3
并做了一些修改
【实现思路】
传输数据的基本流程是这样的
开始数据传输时
1.向驱动申请了4个帧缓冲(VIDIOC_REQBUFS)
2.获取帧缓冲信息(VIDIOC_QUERYBUF),并将申请到的帧缓冲映射到用户空间
3.填充4帧数据后,将4个帧缓冲入驱动队列(VIDIOC_QBUF)
4.select监听并等待设备文件的“可写”状态
5.设备文件“可写”时,出队列取得一帧缓冲(VIDIOC_DQBUF)
6.向帧缓冲填充一帧数据
7.将帧缓冲重新入队列(VIDIOC_QBUF)
重复5-7步实现连续的数据传输

目前已经可以实现,将摄像头实时采集的连续图像数据,经过USB在PC端显示出来。(MJPEG)
PC端使用软件是AMCap
【目前问题】
现在当每帧的数据量保持在500多KB以上时,视频可以连续传输,这没有问题。
但是如果每帧数据量低于500多KB时,可能传输了十几帧,几十帧后,就停止了。
跟踪代码后,发现是在select这边超时了。既select不返回“可写”状态

这个问题查了很久,一直不明白是哪里的原因。
新手刚接触USB这块,烦请各位高手们赐教!~
分 -->
回复

使用道具 举报

千问 | 2021-1-27 05:06:26 | 显示全部楼层
select超时,获取错误码试试?
回复

使用道具 举报

千问 | 2021-1-27 05:06:26 | 显示全部楼层
引用1楼wenxy1的回复:select超时,获取错误码试试?
select超时,errno是22(Invalidargument)

回复

使用道具 举报

千问 | 2021-1-27 05:06:26 | 显示全部楼层
usb使用的是同步传输模式,出现select超时现象时,内核输出log“TherearenomoreISOCrequests”
回复

使用道具 举报

千问 | 2021-1-27 05:06:26 | 显示全部楼层
LZ,请问你用的是什么板子,我也在做这个
回复

使用道具 举报

千问 | 2021-1-27 05:06:26 | 显示全部楼层
1.你的摄像头的帧数可能不是固定了,一般USB摄像头帧数与光照有关。
2.超时时间可以自己设置修改,在select中
3.引起你超时的原因可能是硬件上的原因,如供电能力不足(纯属猜测)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行