使用SurfaceView ,Camera 拍照录像,打开灯光,后台录像,后台拍照,可同时录像拍照

使用SurfaceView ,Camera 拍照录像,打开灯光,后台录像,定时长录像,后台拍照,可同时录像拍照,自适应横竖屏的切换 (录像.mp4 , 拍照.jpg)

package com.bmt.realwear.camerasurfaceview

import android.content.Context
import android.content.res.Configuration
import android.graphics.*
import android.hardware.Camera
import android.hardware.Camera.Parameters.FOCUS_MODE_AUTO
import android.media.MediaRecorder
import android.util.AttributeSet
import android.view.SurfaceHolder
import android.view.SurfaceView
import android.view.View
import com.jay.recorders.objectUtils.ToastUtil
import java.io.IOException

/**
 * @author: Jeff <15899859876@qq.com>
 * @date:  2018-08-03  16:32
 * @description: 使用SurfaceView ,Camera 拍照录像,,可同时录像拍照
 */
class CameraSurfaceView : SurfaceView, SurfaceHolder.Callback, Camera.AutoFocusCallback, View.OnClickListener {
    private var screenOritation = Configuration.ORIENTATION_PORTRAIT
    private var mOpenBackCamera = true
    private var mSurfaceHolder: SurfaceHolder? = null
    private var mSurfaceTexture: SurfaceTexture? = null
    private var mRunInBackground = false
    internal var isAttachedWindow = false
    private var mCamera: Camera? = null
    private var mParam: Camera.Parameters? = null
    private var previewBuffer: ByteArray? = null
    private var mCameraId: Int = 0
    protected var previewformat = ImageFormat.NV21
    internal var context: Context? = null

    private val isSupportCameraLight: Boolean
        get() {
            var mIsSupportCameraLight = false
            try {
                if (mCamera != null) {
                    val parameter = mCamera!!.parameters
                    val a = parameter.supportedFlashModes
                    if (a == null) {
                        mIsSupportCameraLight = false
                    } else {
                        mIsSupportCameraLight = true
                    }
                }
            } catch (e: Exception) {
                mIsSupportCameraLight = false
                e.printStackTrace()
            }

            return mIsSupportCameraLight
        }


    private val previewCallback = Camera.PreviewCallback { data, camera ->
        if (data == null) {
            releaseCamera()
            return@PreviewCallback
        }
        //you can code media here
        if (cameraState != CameraState.PREVIEW) {
            cameraState = CameraState.PREVIEW
            if (cameraStateListener != null) {
                cameraStateListener!!.onCameraStateChange(cameraState!!)
            }
        }
        mCamera!!.addCallbackBuffer(previewBuffer)
    }

    protected var cameraState: CameraState? = null
    private var cameraStateListener: CameraStateListener? = null

    /**
     * ___________________________________以下为视频录制模块______________________________________
     */
    internal var mediaRecorder = MediaRecorder()
    var isRecording = false</
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android Camera2 API 提供了一种更强大的相机框架用于拍照录像和实时图像处理等功能,相比之前的 Camera1 和 Cameraousel API 更加灵活,并提供了一系列高级功能。 ### 高级功能及特性: 1. **自定义控制**:允许开发者精确地控制各种相机属性,包括白平衡、曝光、对焦等,使得相机性能可以更精细地调整到特定应用需求上。 2. **流式API**:通过使用流式API,开发者能够直接操作输入输出数据,而不是依赖传统的回调机制。这使得构建复杂的应用场景变得更为简单。 3. **实时预览与处理**:支持实时视频预览以及在拍摄过程中应用图像处理算法,如添加水印、增强图像质量等。 4. **多种相机硬件的支持**:兼容各种硬件设备,包括手机内置摄像头、外部摄像头、深度传感器等多种设备。 5. **动态配置改变**:允许在运行时更改相机设置,例如修改分辨率、帧率、开启闪光灯等,提高了应用的灵活性和适应性。 6. **高级模式选择**:Camera2 API 支持设置不同的拍照录像模式,如HDR、连拍、慢动作等,满足不同应用场景的需求。 ### 使用步骤概览: 1. **初始化**:首先需要获取相机管理服务实例 `CameraManager` 并打开指定的相机设备。通常会使用默认的前摄像头或后摄像头。 ```java CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); String cameraId = getFirstAvailableCameraId(cameraManager); // 打开相机并开始预览 cameraManager.openCamera(cameraId, cameraDeviceStateCallback, null); ``` 2. **创建预览设置**:通过 `SurfaceView` 或 `TextureView` 创建预览表面,并设置预览参数,如分辨率、帧率等。 3. **启动预览**:将预览表面与相机的预览表面关联,并开始预览。 4. **拍照录像**:使用 `CaptureRequest` 和 `VideoStabilizationRequest` 等请求来触发拍照录像。需要注意的是,这些请求需在适当的时机发送,通常是在预览准备就绪后。 5. **释放资源**:完成拍照录像后,记得关闭相机并释放所有相关的资源。 ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值