音视频学习记录Camera2系列一:拍照

这篇博客详细记录了使用Camera2 API进行音视频学习的过程,主要讲解如何初始化、获取Surface并开启摄像头,设置回调捕获拍照进度,并在退出时进行相应处理,确保预览尺寸不变形和能够切换相机。
摘要由CSDN通过智能技术生成

用到的属性

//摄像头id列表
private lateinit var idList:Array<String>
//当前摄像头id
private lateinit var cameraId:String
//当前摄像头属性类
private lateinit var cameraCharacteristics:CameraCharacteristics
//预览Surface
private lateinit var surface:Surface
//当前摄像头
private lateinit var cameraDevice: CameraDevice
//拍照输出Surface
private lateinit var imageReader:ImageReader
//预览CaptureRequest.Builder
private lateinit var captureRequestBuilder: CaptureRequest.Builder
//拍照CaptureRequest.Builder
private lateinit var photographCaptureRequest: CaptureRequest.Builder
//显示拍照图片的协程
private var mainJob:Job? = null
//Session
private lateinit var cameraCaptureSession: CameraCaptureSession
//相机分辨率
private lateinit var size:Size

初始化

override fun init() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        //初始化
        CameraUtil.init(application)
        //获取摄像头id列表
        idList = CameraUtil.getCameraIdList()
        cameraId = idList[CameraUtil.index]

        //开启surfaceTextureListener监听,获取Surface
        textureView.surfaceTextureListener = surfaceTextureListener
    }

    //拍照
    button.setOnClickListener {
        photograph()
    }

    //切换相机
    switchCamera.setOnClickListener {
        switchCamera()
    }

}

/**
 * 拍照
 */
private fun photograph(){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        // 设置获取的照片方向
        if (CameraUtil.index == 0){
            CameraUtil.photoDirection(photographCaptureRequest,90)
        }else {
            CameraUtil.photoDirection(photographCaptureRequest,90*3)
        }

        //停止连续取景
        cameraCaptureSession.stopRepeating()
        //捕获单张图片
        cameraCaptureSession.capture(photographCaptureRequest.build(), captureCallback, CameraUtil.getBackgroundHandler())
    }
}

/**
 * 切换相机
 */
private fun switchCamera(){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        cameraDevice.close()
        imageReader.close()
        //切换相机
        cameraId = CameraUtil.switchCamera(this,mStateCallback)
    }
}

获取Surface并开启摄像头

/**
 * 获取Surface的回调
 */
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
private val surfaceTextureListener = object :TextureView.SurfaceTextureListener{
    //SurfaceTexture大小发生变化时调用
    override fun onSurfaceTextureSizeChanged(surfaceTexture: SurfaceTexture, width: Int, height: Int) {
        //获取相机属性类
        cameraCharacteristics = CameraUtil.getCameraCharacteristics(cameraId)

        //设置预设的预览尺寸
        size = CameraUtil.setDefaultBufferSize(surfaceTexture,cameraCharacteristics)

        surface = Surface(surfaceTexture)
    }

    override fun onSurfaceTextureUpdated(surface: SurfaceTexture?) {

    }

    override fun onSurfaceTextureDestroyed(surfaceTexture: SurfaceTexture?): Boolean {
        return true
    }

    override fun onSurfaceTextureAvailable(surfaceTexture: SurfaceTexture, width: Int, height: Int) {
        //获取相机属性类
        cameraCharacteristics = CameraUtil.getCameraCharacteristics(cameraId)

        //设置预设的预览尺寸
        size = CameraUtil.setDefaultBufferSize(surfaceTexture,cameraCharacteristics)

        surface = Surface(surfaceTexture)

        //开启摄像头
        CameraUtil.openCamera(this@VideoActivity,cameraId,mStateCallback)
    }
}

/**
 * 自动修改textureView宽高以适应不同预览比例
 *
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值