前言
这篇文章简单介绍下移动端Android系统下利用Camera1
进行视频数据采集的方法。
按照惯例先上一份源码 AndroidVideo。
Camera1调用摄像头采集视频的核心实现在CameraCapture.java。
权限配置
使用Android平台提供的摄像头,首先必须在配置文件中添加如下权限配置:
<uses-permission android:name="android.permission.CAMERA"/>
打开摄像头
1、首先我们需要获取当前设备的摄像头数量:
int cameraNum = Camera.getNumberOfCameras();
2、一般业务上面都会指定是打开前置摄像头还是后置摄像头:
//获取对应摄像头信息
for (int id = 0; id < cameraNum; id++) {
Camera.getCameraInfo(id, info);
if (info.facing == cameraId) {
//TODO
}
}
判断info.facing
的值,他的值有如下几种:
Camera.CameraInfo.CAMERA_FACING_FRONT
:前置摄像头Camera.CameraInfo.CAMERA_FACING_BACK
:后置摄像头
3、调用打开摄像的接口,它的原型是public static Camera open(int cameraId)
需要传入的是摄像头的ID;一般手机发展来说,都是先有后置摄像头,然后才发展前置摄像头,所以摄像头的ID排列是后置是0,前置是1,其他摄像头再递增。
但是我们最好通过CAMERA_FACING_FRONT
和CAMERA_FACING_BACK
比对才比较靠谱。
open()
返回摄像头实例,如果返回NULL或者抛异常,请检查cameraId
传入是否有误或者权限申请被禁止情况。
配置摄像头参数
一般来说,我们需要关注摄像头预览格式、帧率和宽高尺寸等配置。
获取参数集合
//获取摄像头参数设置集合
Camera.Parameters parms = mCamera.getParameters();
//进行参数设置
//必须setParameters后,更新的属性才会生效
mCamera.setParameters(parms);
设置预览格式
一般最通用的就是ImageFormat.NV21
格式,其实也就是YUV420SP
格式,对于YUV的具体格式这里不做扩展分析,其最重要一点就是YUV420SP
的UV是交错存放在一个平面的。
我们需要调用parms.getSupportedPreviewFormats()
返回一个支持格式列表,然后判断其中是否包含我们所需要的格式。
//获取支持的预览格式集合
List<Integer> supportedPreviewFormat = parms.getSupportedPreviewFormats();
//一般来说,ImageFormat.NV21通用适配绝大部分手机
if (supportedPreviewFormat.contains(mConfig.mFormat)) {
parms.setPreviewFormat(mConfig.mFormat);
}
else {
//格式不兼容,采用默认格式 or 返回客户端处理错误
}
设置预览宽高
通过调用parms.getSupportedPreviewSizes()
得出支持的size列表,然后对比我们需要的szie,查询列表中是否存在。
如果不存在,建议取一个相对靠近的支持的size进行设置。
int weight;
int lastWeight = Integer.MAX_VALUE;
int curWidth = 0, curHeight = 0;
//获取支持的预览size列表
List<Camera.Size> sizes = parms.getSupportedPreviewSizes();
for (Came