Camera2 API---------随笔记录
预览操作:
启动后台线程 ----- 给textureView设置监听 ----onAvaliable的时获取相机信息, 确定预览尺寸--------开启相机, 需要传入回调cameraDevice.stateCallback------onOpened中开启预览---- captureRequestBuilder设置相机参数,------设置 target surface ( texture.getSurface())----- 创建cameraCaptureSession,传入回调 stateCallback---- onConfigured时setRepeatingRequest重复捕获会话图像---------------------------至此预览就完成了
capturerequestBuilder 设置相机参数-----设置target ( imageReader. getSurface)------cameraCaptureSession. capture() 传入 captureCallback------然后可以在onComplete中做一些后续处理
同时, 拍照得到的图片会下发到imageReader的surface中, imageReader有个监听 onImageAvaliableListener, 在这里可以做一些图片保存的操作
SurfaceView ImageReader MediaRecorder 从surface获取数据之后怎么工作的?
深层逻辑都调用了native代码
surfaceView/ TextureView 内部都有一个canvas, 在从surface获取到数据之后, 可以绘制出来
ImageReader内部相当于有个队列, 其构造方法中要传入 宽, 高, 图片格式, 以及最大缓存图片数量,新的图片通过surface传到imageReader, 同时我们通过 acquireLatestImage或者 acquireNextImage方法从队列中取出图片, 如果我们取的速度(处理图片的速度)小于数据源生产图片的速度, 最终就会产生丢帧
acquireNextImage 从队列中获取下一帧, 没有则返回null;acquireLatestImag从队列中获取最新一帧, 并且将老的丢弃, 内部其实也调用了acquireNextImage, 但是加了 丢弃 旧 image的操作, 所以比较推荐
MediaRecorder, 是一个用来录制音频、视频的类:它有 initial (初始状态), 已初始化状态, 数据源配置状态, prepare(就绪状态), recording(录像状态),released, error 7种状态,我们在使用时需要严格按照状态图中的函数调用顺序, 否则会报异常
因此, 我们录像时, 首先setupMediaRecorder(){
setAudioSource()
setVideoSource( surface ) //进入已初始化状态
setOutputFormat() // 进入数据源配置状态
setAudioEncoder()
setVideoEncoder()
…
prepare()// 进入prepare状态
}
然后,当按下录像按钮时, 调用mediaRecorder.start() 方法, 进入recording 状态
MediaRecorder内部也有一个surface, camera将一帧帧的图片下发到 surface, 然后surface作为mediaRecorder–video的数据源
到 surface, 然后surface作为mediaRecorder–video的数据源