关键类使用
- TextureView
- WindowManager
- CameraManager
- StreamConfigurationMap
- MediaRecorder
- CameraDevice
- CameraDevice.StateCallback
- CaptureRequest.Builder
- CameraCaptureSession
- CameraCharacteristics
- StreamConfigurationMap
- CaptureRequest.Builder
- ImageReader
注意事项
1、每次界面失去焦点或者录制结束时都要重新销毁当前相机。
2、每次界面重新获取焦点时重新初始化当前相机流程。
3、注意组件宽高为准选择合适的相机尺寸,矩阵缩放时更加自然!
功能类代码介绍
TextureView
- 相机预览展示组件
- 开发相机手势操作:焦距放大、缩小、点击获取焦点
- 控制相机、视频预览显示方向、大小、比例
- 根据手机旋转动态调整相机显示方向
WindowManager
- 获取手机旋转方向:90度、270度等
- 相机输出画面,输出的图片、视频旋转角度以此为准
CameraManager
- 查找手机摄像头:前置摄像头、后置摄像头、USB扩展摄像头等
- 拿到摄像头cameraId
- 打开指定摄像头
- 获取摄像头相机参数 StreamConfigurationMap、CameraCharacteristics
StreamConfigurationMap
- 获取当前摄像头支持的输出尺寸、9:6 4:3 1:1等,返回的格式宽高,单位像素,例如 1080:1920等
- 根据客户端业务查找最优尺寸,根据不同的机型动态适配最优尺寸。
CameraDevice.StateCallback
- 监听相机打开、异常、断开
- 拿到CameraDevice
CameraDevice
- 当前摄像头引用对象
- 获取采集图像流展示到TextureView
- 创建相机预览会话
- 添加ImageReader拍照数据回调处理器
- 拿到当前相机会话,CameraCaptureSession (执行拍照,相机会话管理)
- 拿到相机览流控制器CaptureRequest.Builder (设置拍照闪光灯)
CaptureRequest.Builder
- 相机视频流控制器
- 展示相机焦距调整之后的画面。例如:用户通过手势放大缩小焦距。
CaptureRequest.Builder.set(CaptureRequest.SCALER_CROP_REGION, mRoom);
- 设置拍照时闪光灯展示、相机预览时开启手电筒。
CameraCaptureSession
- 控制预览流展示与暂停
- 执行拍照,注意拍照时要暂停预览,不然会捕捉的画面,会是下一帧图像。
- 拍照完成之后在CameraCaptureSession.CaptureCallback回调里面重新打开预览。
ImageReader
- 获取执行拍照时捕获的帧,保存成图片
- ImageReader.OnImageAvailableListener 在此监听器回调,注意子线程保存。
- 为了获取图方便,建议再保存时添加回调,自动更新到展示界面。
CameraDevice.StateCallback
- 监听相机打开、异常、断开
- 拿到CameraDevice
MediaRecorder
- 视频录制控制器
- 设置视频录制方向setOrientationHint(90)前置摄像头:270、后置90.
- 帧率:一秒展示多少帧图像,视频卡顿。
- 视频码率:码率和质量成正比,但是文件体积也和码率成正比,
- 码率:mMediaRecoder.setVideoEncodingBitRate() , 太小界面模糊、太大文件越大。
目前最优设置默认10000000,然后根据当前使用相机尺寸(宽*高)动态匹配取最大值。
视频压缩优化
1、根据业务设置相机输出尺寸,找出最合适的尺寸大小。
2、调整视频录制帧率。
3、设置视频清晰度
4、FFmpeng?
图片压缩优化
1、根据业务设置相机输出尺寸,找出最合适的尺寸大小。
2、等比例缩放指定大小。
3、质量压缩