Android 平台camera相关梳理

来源:互联网 发布:知乎马前卒是谁 编辑:程序博客网 时间:2024/06/05 03:19

其实这个题目起得有点大,不过,我实在找不到好的描述。

本文主要的作用是梳理思路用的。

一、usb 免驱camera。 其实就是UVC camera,免驱其实是免除手动安装,实际上是camera和系统都必须支持UVC的协议,然后系统自动安装。对于android来说,必须把底层的v4l2打开,然后添加jni层,上层才能调用。

二、和第一点对应的就是像mtk平台自带的camera,这种camera是mipi或者其他接口协议的数据,和第一点应该是完全不同的流程。

三、关于camera ISP(image single processor)的概念,平台不带isp的,camera模组本身一定要带。

四、单个摄像头如何做到capture video 不漏秒?两种流程应该需要分开来处理。

         要解决这个问题,必须非常熟悉这两个流程。usb camera就是要把v4l2玩好。

        网上总结的基本流程,非常清晰:

        1.打开设备文件。 int fd=open(”/dev/video0″,O_RDWR);
        2.取得设备的capability,看看设备具有什么功能,比如是否具有视频输入,或者音频输入输出等。VIDIOC_QUERYCAP,struct v4l2_capability;
        3.设置视频的制式和帧格式,制式包括PAL,NTSC,帧的格式包括宽度和高度等。VIDIOC_S_STD,VIDIOC_S_FMT,struct v4l2_std_id,struct v4l2_format;
        4.向驱动申请帧缓冲,一般不超过5个。struct v4l2_requestbuffers;
        5.将申请到的帧缓冲映射到用户空间,这样就可以直接操作采集到的帧了,而不必去复制。mmap;
        6.将申请到的帧缓冲全部入队列,以便存放采集到的数据.VIDIOC_QBUF,struct v4l2_buffer;
        7.开始视频的采集。VIDIOC_STREAMON;
        8.出队列以取得已采集数据的帧缓冲,取得原始采集数据。VIDIOC_DQBUF;
        9.将缓冲重新入队列尾,这样可以循环采集。VIDIOC_QBUF;
      10.停止视频的采集。VIDIOC_STREAMOFF;
      11.关闭视频设备。close(fd);

      重点从入队列和出队列来找突破点。


五、两个摄像头同时开启录像,会不会有其他的什么问题?例如传输带宽等。

        涉及到的知识点:数据格式,压缩方式

        好像H264和mpeg比较通用。       

        搞清软解码和硬解码的区别:cpu解就是软解,显卡就是硬解。如果是双路摄像头同时录像的,最好能分开,一个软解,一个硬解。平台自带的camera调用的是gpu,属于硬解(MediaRecorder \ MediaCodec)。usb camera则需要自己利用开源h.264来编译.so来进行软解。


六、后台录像。这个简单,启用一个service就行。


需要加强的地方:

cameraservice相关的framework层


参考文章:

http://www.cnblogs.com/skyseraph 有一系列文章介绍,并且排版很好,方便阅读。

http://blog.csdn.net/andyhuabing/article/details/7229557

0 0