android Camera2使用
前言:由于有关camera2使用和对数据处理的比较少所以笔者也有着乐于助人心所以有了后面的内容。咋们废话不多说先把流程和目的说下。首先是获取到相关摄像头id、然后打开摄像、接收摄像头数据回调、将y、u、v拼接成完整的yuv、对数据进行旋转生成正常用户看到的画面,以及对yuv数据编码为h264数据。
Camera2 API介绍
1.获取前或者后置摄像头 摄像头都有对应的摄像头id、获取到摄像头id后面有相应的接口打开此id
CameraManager cameraManager = (CameraManager) this.getSystemService(Context.CAMERA_SERVICE);
for (String cameraId : cameraManager.getCameraIdList()){
CameraCharacteristics characteristic
= cameraManager.getCameraCharacteristics(cameraId);
Integer facing = characteristic.get(CameraCharacteristics.LENS_FACING);
if (facing != null && facing == CameraCharacteristics.LENS_FACING_FRONT) {
Log.d(TAG, "onSurfaceTextureAvailable: front camera is cameraid="+cameraId);
break;
}
}
2.打开摄像头以及打开状态回调
cameraManager.openCamera(mCameraId, mCameraDeviceStateCallback, mHandler);
//回调
public CameraDevice mCameraDevice;
private CameraDevice.StateCallback mCameraDeviceStateCallback = new CameraDevice.StateCallback() {
@Override
public void onOpened(CameraDevice camera) {
try {
mCameraDevice = camera;//保存此摄像头对象
startPreview(camera);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onDisconnected(CameraDevice camera) {
camera.close();
mCameraDevice = null;
}
@Override
public void onError(CameraDevice camera, int error) {
camera.close();
mCameraDevice = null;
}
};
3.设置分辨率 可根据你显示的view大小进行设置、设置回调数据格式、以及添加预览和回调数据监听
SurfaceTexture texture = mPreviewView.getSurfaceTexture();
// 这里设置的就是预览大小
texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
Surface surface = new Surface(texture);
//设置读取的图片分辨率
CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
CameraCharacteristics characteristics
= manager.getCameraCharacteristics(mCameraId);
StreamConfigurationMap map = characteristics.get(
CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
//小米不支持NV21 支持YV12
Size largest = Collections.max(
Arrays.asList(map.getOutputSizes(ImageFormat.YV12)),//YUV_420_888<