第15讲 Android Camera2 API Surface Sharing实战

本讲是Android Camera专题系列的第15讲,我们介绍Android Camera2 API专题的Surface Sharing。

 

视频在线观看:

Android Camera2 API课程体系

Android Camera2 API课程体系


 

在创建Camera Capture Session前Add Share Surface

synchronized( background_camera_lock ) {
    Surface preview_surface = getPreviewSurface();
    if( video_recorder != null ) {
        if( supports_photo_video_recording && !want_video_high_speed && want_photo_video_recording ) {
            surfaces = Arrays.asList(preview_surface, video_recorder_surface, imageReader.getSurface());
            captureOutputConfiguration = new OutputConfiguration(imageReader.getSurface());
            mPreviewOutputConfiguration = new OutputConfiguration(preview_surface);
            if (mEnablePreviewShareSurface) {
                mPreviewOutputConfiguration.enableSurfaceSharing();
                mPreviewOutputConfiguration.addSurface(video_recorder_surface);
            } else {
                recordOutputConfiguration = new OutputConfiguration(video_recorder_surface);
            }
        }
        else {
            surfaces = Arrays.asList(preview_surface, video_recorder_surface);
            mPreviewOutputConfiguration = new OutputConfiguration(preview_surface);
            if (mEnablePreviewShareSurface) {
                mPreviewOutputConfiguration.enableSurfaceSharing();
                mPreviewOutputConfiguration.addSurface(video_recorder_surface);
            } else {
                recordOutputConfiguration = new OutputConfiguration(video_recorder_surface);
            }
        }
        // n.b., raw not supported for photo snapshots while video recording
    }
    else if( want_video_high_speed ) {
        // future proofing - at the time of writing want_video_high_speed is only set when recording video,
        // but if ever this is changed, can only support the preview_surface as a target
        surfaces = Collections.singletonList(preview_surface);
        mPreviewOutputConfiguration = new OutputConfiguration(preview_surface);
        mPreviewOutputConfiguration.enableSurfaceSharing();
    }
    else if( imageReaderRaw != null ) {
        surfaces = Arrays.asList(preview_surface, imageReader.getSurface(), imageReaderRaw.getSurface());
    }
    else {
        surfaces = Arrays.asList(preview_surface, imageReader.getSurface());
        mPreviewOutputConfiguration = new OutputConfiguration(preview_surface);
        mPreviewOutputConfiguration.enableSurfaceSharing();
        captureOutputConfiguration = new OutputConfiguration(imageReader.getSurface());
    }
    if( MyDebug.LOG ) {
        Log.i(TAG, "texture: " + mSurfaceTexture);
        Log.i(TAG, "preview_surface: " + preview_surface);
    }
}

在创建Camera Capture Session后Add Share Surface

@Override
public void onConfigured(@NonNull CameraCaptureSession session) {
    if( MyDebug.LOG ) {
        Log.i(TAG, "onConfigured: " + session);
        Log.i(TAG, "captureSession was: " + mCameraCaptureSession);
    }
    if( mCameraDevice == null ) {
        if( MyDebug.LOG ) {
            Log.i(TAG, "camera is closed");
        }
        synchronized( background_camera_lock ) {
            callback_done = true;
            background_camera_lock.notifyAll();
        }
        return;
    }
    synchronized( background_camera_lock ) {
        mCameraCaptureSession = session;
        Surface surface = getPreviewSurface();
        if( MyDebug.LOG ) {
            Log.i(TAG, "add surface to previewBuilder: " + surface);
        }
        mPreviewBuilder.addTarget(surface);
        if( video_recorder != null ) {
            if( MyDebug.LOG ) {
                Log.i(TAG, "add video recorder surface to previewBuilder: " + video_recorder_surface);
            }
            mPreviewBuilder.addTarget(video_recorder_surface);
        }
        if (mEnablePreviewShareSurface) {
            mPreviewOutputConfiguration.addSurface(mPreviewImageReader.getSurface());
            try {
                mCameraCaptureSession.updateOutputConfiguration(mPreviewOutputConfiguration);
                mPreviewBuilder.addTarget(mPreviewImageReader.getSurface());
            } catch (Exception e) {
                Log.e(TAG, "updateOutputConfiguration with exception:" + e.toString());
            }
        }
        try {
            setRepeatingRequest();
        }
        catch(CameraAccessException e) {
            if( MyDebug.LOG ) {
                Log.e(TAG, "failed to start preview");
                Log.e(TAG, "reason: " + e.getReason());
                Log.e(TAG, "message: " + e.getMessage());
            }
            e.printStackTrace();
            // we indicate that we failed to start the preview by setting captureSession back to null
            // this will cause a CameraControllerException to be thrown below
            mCameraCaptureSession = null;
        }
    }
    synchronized( background_camera_lock ) {
        callback_done = true;
        background_camera_lock.notifyAll();
    }
}
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

deepinout_camera

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值