技术领域
本发明涉及通讯技术领域,尤其涉及一种基于android终端提高USB2.0摄像头高分辨率高帧率的方法。
背景技术
多媒体终端基于android平台,在会议应用等场景中,需要使用外置的USB摄像头,以提高清晰程度,但市面上较多的都是支持USB2.0摄像头,采集的格式一般支持YUV/MJPEG格式,目前多媒体终端抽象层采用的是YUV格式,如果分辨率超过720P/1080P的时候,由于受USB带宽限制,通常帧率达不到15以上,这就在运动比较频繁的场景中,多媒体终端使得用户体验不够好。
发明内容
本发明要解决的技术问题,在于提供一种基于android终端提高USB2.0摄像头高分辨率高帧率的方法,使得USB2.0摄像头不会在运动频率比较大的情况下,采集的视频出现模糊情况。
本发明是这样实现的:一种基于android终端提高USB2.0摄像头高分辨率高帧率的方法,
所述USB2.0摄像头支持UVC驱动,通过V4L2接口设置采样视频的格式;
在采集的视频分辨率是720P/1080P时,摄像头抽象层采用MJPEG格式,从摄像头抽象层收到MJPEG流后,将MJPEG流实时转成NV21格式,使android终端的应用层在高分辨率情况下使用高帧率。
进一步的,所述方法进一步具体为:
打开摄像头抽象层时,通过ioctl函数向UVC驱动申请缓存buffer,并通过mmap函数将缓存buffer映射进用户空间;
USB2.0摄像头适配层里面的StartPrivew函数会设置视频格式的长和宽,在设置NV21格式时,则判断视频分辨率是否是720P/1080P,如果是720P/1080P,则视频格式转化成V4L2_PIX_FMT_MJPEG,否,则不进行操作;
线程类PreviewThread获取到一帧数据frame后,将视频的MJPEG格式数据存储在frame虚拟地址上;如果帧格式是V4L2_PIX_FMT_MJPEG,则进行MJPEG转化成NV12数据;
把转换解码出得的NV21数据拷贝到frame虚拟地址,并重新设置帧数据frame的格式为V4L2_PIX_FMT_NV21。
进一步的,所述MJPEG转化成NV12数据能采用硬件加速进行转换解码,硬件加速流程如下:
首先USB2.0摄像头动态加载硬件加速库librk_vpuapi.so;
通过dlsym函数,获取MJPEG解码函数get_class_RkJpegDecoder;
根据获取到得解码函数,进行MJPEG转换解码成NV21格式;
如果不支持硬件加速时,则进行软件解码MJPEG。
本发明具有如下优点:本发明在采集的视频分辨率是720P/1080P时,摄像头抽象层采用MJPEG格式,从摄像头抽象层收到MJPEG流后,将MJPEG流实时转成NV21格式,使android终端的应用层在高分辨率情况下使用高帧率;本发明能在USB2.0摄像头分辨率高的情况下,提高了帧率,提高用户的体验,USB2.0摄像头不会在运动频率比较大的情况下,采集的视频出现模糊情况。
附图说明
图1为本发明方法流程示意图。
具体实施方式
请参阅图1所示,本发明的一种基于android终端提高USB2.0摄像头高分辨率高帧率的方法,
所述USB2.0摄像头支持UVC驱动,通过V4L2接口设置采样视频的格式;其中,USB2.0通常支持MJPEG压缩格式,通过MJPEG格式,MJPEG是一种视频压缩格式,每一帧图像分辨使用JPEG编码,占用带宽比原始的YUV格式小很多,所以即使720P(长1280,宽720)/1080P分辨率下,也是可以支持20/30帧;该USB2.0摄像头即插即用免驱动;
在采集的视频分辨率是720P/1080P时,摄像头抽象层采用MJPEG格式,从摄像头抽象层收到MJPEG流后,将MJPEG流实时转成NV21格式,使android终端的应用层(APP应用程序)在高分辨率情况下使用高帧率。
其中,所述方法进一步具体为:
打开摄像头抽象层时,通过ioctl函数向UVC驱动申请缓存buffer,并通过mmap函数将缓存buffer映射进用户空间;
USB2.0摄像头适配层里面的StartPrivew函数会设置视频格式的长和宽,在设置NV21格式时,则判断视频分辨率是否是720P/1080P,如果是720P/1080P,则视频格式转化成V4L2_PIX_FMT_MJPEG(即通过V4L2接口设置视频格式VIDIOC_S_FMT为V4L2_PIX_FMT_MJPEG格式;),否,则不进行操作;这种做法保证android终端app应用默认还是NV21格式,无需改变上面应用程序。
线程类PreviewThread获取到一帧数据frame后,将视频的MJPEG格式数据存储在frame虚拟地址上;如果帧格式是V4L2_PIX_FMT_MJPEG,则进行MJPEG转化成NV12数据;
把转换解码出得的NV21数据拷贝到frame虚拟地址,并重新设置帧数据frame的格式为V4L2_PIX_FMT_NV21。
另外,所述MJPEG转化成NV12数据能采用硬件加速进行转换解码,硬件加速流程如下:如RK3288芯片,支持硬件加速,
首先USB2.0摄像头动态加载硬件加速库librk_vpuapi.so;
通过dlsym函数,获取MJPEG解码函数get_class_RkJpegDecoder;
根据获取到得解码函数,进行MJPEG转换解码成NV21格式;
如果不支持硬件加速时,则进行软件解码MJPEG。
总之,本发明在采集的视频分辨率是720P/1080P时,摄像头抽象层采用MJPEG格式,从摄像头抽象层收到MJPEG流后,将MJPEG流实时转成NV21格式,使android终端的应用层在高分辨率情况下使用高帧率;本发明能在USB2.0摄像头分辨率高的情况下,提高了帧率,提高用户的体验,USB2.0摄像头不会在运动频率比较大的情况下,采集的视频出现模糊情况。
以上所述仅为本发明的较佳实施例,凡依本发明申请专利范围所做的均等变化与修饰,皆应属本发明的涵盖范围。