MediaRecorder + Camera2 视频录制最佳实践

 MediaRecorder 是 Android 官方提供的一个用于音视频录制的类,简化了音频和视频的录制过程,如果只是想单纯的录制视频,MediaRecorder是一个不错的选择

这里采用 Camera2 + MediaRecorder 的方式实现视频录制

步骤:

  1. 获取 CameraManager 实例
  2. 调用 openCamera,打开摄像头
  3. 创建 session
  4. 开启预览
  5. 开启录制
  6. 停止录制

一、获取CameraManager 实例

// 1. 先获取 CameraManager
mCameraManager = (CameraManager) mContext.getSystemService(Context.CAMERA_SERVICE);

通过 getSystemService(Context.Camera_SERVICE) 即可获取到 CameraManager 的实例,CameraManager 是一个负责查询和建立相机连接的系统服务,Camera2 的所有操作都是从先获取 CameraManager 实例开始

二、调用 openCamera,打开摄像头

// 2. 调用 openCamera,打开摄像头
mCameraManager.openCamera(String.valueOf(mCurrentFacing), new CameraDevice.StateCallback() {
    @Override
    public void onOpened(@NonNull CameraDevice camera) {
        LogUtil.d(TAG, "onOpened: 摄像头链接成功, facing: " + mCurrentFacing);
        // 摄像头成功打开
        mCurrentCameraDevice = camera;
    }
​
    @Override
    public void onDisconnected(@NonNull CameraDevice camera) {
        LogUtil.d(TAG, "onDisconnected: 摄像头链接断开");
    }
​
    @Override
    public void onError(@NonNull CameraDevice camera, int error) {
        LogUtil.d(TAG, "onError: 摄像头打开失败, error: " + error);
        camera.close();
    }
}, null);

使用上一步获取到的 CameraManager 实例,调用 openCamera 方法,即可获取到指定摄像头的 CameraDevice 实例,可以对指定摄像头进行操作

三、创建 session

// 3. 创建session,可以看到这里绑定了两个 surface,一个用于承载预览显示,一个用于视频录制
List<Surface> mOutputs = new ArrayList<>();
mOutputs.add(mPreviewSurface);
mOutputs.add(mRecordSurface);
mCurrentCameraDevice.createCaptureSession(mOutputs, new CameraCaptureSession.StateCallback() {
    @Override
    public void onConfigured(@NonNull CameraCaptureSession session) {
        mCurrentCameraCaptureSession = session;
        try {
            // 4. 开启预览
            createPreviewCaptureRequest();
            mCurrentCameraCaptureSession.setRepeatingRequest(mCurrentPreviewRequest, null, null);
        } catch (CameraAccessException e) {
            LogUtil.e(TAG, "onConfigured: ", e);
        }
    }
​
    @Override
    public void onConfigureFailed(@NonNull CameraCaptureSession session) {
​
    }
}, null);

Camera2 比较特殊的点就是,所有的操作行为都是在 session 上完成的,所以 打开摄像头之后,通过 CameraDevice 实例创建指定的 session

值得注意的是,在 createSession 的时候有一个绑定 surface 的操作,这关系到后续能在 session 上执行什么操作,如果需要预览,那需要绑定 承载预览流的 previewSurface,如果需要录制视频,需要绑定 承载视频流的 recordSurface,如果需要拍照,则需要绑定 承载拍照数据的 imageReader

这里我们需要预览和录制,所以绑定了两个surface,一个用于预览,一个用于录制

四、开启预览

// 4. 开启预览
createPreviewCaptureRequest();
mCurrentCameraCaptureSession.setRepeatingRequest(mCurrentPreviewRequest, null, null);
​
/**
 * 用于预览显示的request
 */
private void createPreviewCaptureRequest() {
    try {
        CaptureRequest.Builder mCurrentPreviewRequestBuilder = mCurrentCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
        mCurrentPreviewRequestBuilder.addTarget(mPreviewSurface);
        mCurrentPreviewRequest = mCurrentPreviewRequestBuilder.build();
    } catch (CameraAccessException e) {
        LogUtil.e(TAG, "createPreviewCaptureRequest: ", e);
    }
}

createSession 成功之后,就可以 创建 CaptureRequest,然后通过 session 的 setRepeatingRequest 方法开始呈现预览了

如果只需要呈现预览,到这里已经完成了,接下来开始录制

五、开启录制

private void startRecording(){
    isRecording = true;
    try {
        // 5. 开启录制
        // 先准备 mediaRecorder
        prepareMediaRecorder();
        // 创建录制视频用的 request
        createVideoRecordCaptureRequest();
        // 先将 PreviewRequest 停掉,因为 PreviewRequest 只绑定
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值