Advertisement

USB摄像头录制视频

阅读量:

目前在致力于Android平板设备上的USB摄像头视频录制测试工作,并对此进行了详细记录

项目要求用USB摄像头录制视频,要求视频必须是720P+,25FPS+。

USB摄像头采用的是海康威视摄像头。YUV格式仅限于10FPS的帧率 MJPEG格式则能够达到30FPS的帧率 因此建议选择MJPEG格式作为传输方式

为了探索UVCCamera项目的潜在功能,我访问了其GitHub仓库 https://github.com/saki4510t/UVCCamera。经过尝试后发现所录视频的实际帧率均未达到预期。

在后端处理中,我们仅限于通过V4L2接口获取摄像头的原始数据。参考文章:安卓系统采用v4l2接口打开YUYV和MJPEG摄像头, 支持热插拔._alterli的博客-博客]()

获取到的摄像头原始数据是多张JPG图像。
将JPG图片转换为MP4大大简化了过程。
首先通过解码器将JPEG图像转换为BMP格式的数据。
接着使用Android内置的媒体编解码器MediaMuxer处理这些BMP数据。
并将其选择为COLOR_Format32bitBGRA8888的数据源格式。
然而,在获取源数据后依次进行解码和编码的过程中效率较低。

受摄像头性能限制以及受限于YUV格式仅有10帧每秒的帧率,在安卓平台硬件性能上确实是个难题。

查阅了大量相关资料后发现走了一些弯路,并曾尝试使用FFmpeg程序来实现JPEG图片到MP4的转换过程。然而发现其编码效率令人不尽如人意

没有办法,V4L2目前仍是唯一一种可行的办法。
不得不放弃实时性,用空间换取时间,开启多个线程,同时将摄像头捕获到的原始数据以JPEG格式存储,随后同时解码并转换为BMP格式以便进行视频编码。
这种方案能够实现约30FPS的操作速度,但这种方式也存在一些不足之处。
具体来说,在摄像头完成录制之后还需要一定的时间来对这些文件进行处理和优化。

在更换了另一块硬件之后发现其性能表现得非常差,并且无法支持COLOR_Format32bitBGRA8888格式编码视频

为了了解MP4所支持的数据源类型,在查阅相关资料后发现仅限于YUV420P格式。因此,主要挑战在于将JPEG图像数据转换为该格式。

深入调查后发现现有相关算法种类繁多且性能卓越其中将JPEG解码转换为BMP文件的过程耗时较多经由该过程至YUV42...编码转换步骤后总体效率仍显不足

不考虑bmp转YUV420P,有没有直接解码JPEG到YUV420P的办法呢。答案是肯定的。

利用libturbojpeg库可以实现,上关键代码

复制代码

确认解码后的yuv_type显示为YUV422后发现并不能满足需求

YUV422有多种不同的格式形式包括YYV YUV422P和YUV422SP等而将YUV421转换为YUV411最简便有效的办法是采取逐行分离法提取U和V分量这一操作过程中曾遇到过一些困惑最初误以为只需每隔一个像素点提取对应的U或V值但在实际操作中发现并不符合预期后来经过仔细思考才发现实际上是每隔一行都需要完整地提取相应的U和V数据块

最后验证的结果显示效率确实提升了翻一番,在完成一张JPEG图像的编码大约需要100毫秒的情况下。对于一个时长为10秒的视频文件包含300帧图像片段而言,在这种情况下处理耗时约半分钟显得略显缓慢。这样的处理速度确实令人担忧

后面想到好的方式再继续优化。

全部评论 (0)

还没有任何评论哟~