高速捕获请求 Android Marshmallow

JPa*_*h88 5 android android-camera

我在设置高速视频的捕获请求时遇到一些问题。我打算在 Nexus 6P 上以 120 FPS 进行拍摄。我将最小 API 设置为 23,因为我不打算将此应用程序部署到任何其他手机。

我不太明白的是如何让我的捕获请求发挥作用。现在,我正在尽力更改谷歌示例中 Camera2Video 示例中的代码。来自 Google 的示例链接

这是所有相关代码:

private void startPreview() {
    if (null == mCameraDevice || !mTextureView.isAvailable() || null == mPreviewSize) {
        return;
    }
    try {
        setUpMediaRecorder();
        SurfaceTexture texture = mTextureView.getSurfaceTexture();
        assert texture != null;
        texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
        mPreviewBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
        List<Surface> surfaces = new ArrayList<Surface>();

        Surface previewSurface = new Surface(texture);
        surfaces.add(previewSurface);
        mPreviewBuilder.addTarget(previewSurface);

        Surface recorderSurface = mMediaRecorder.getSurface();
        surfaces.add(recorderSurface);
        mPreviewBuilder.addTarget(recorderSurface);

        mCameraDevice.createConstrainedHighSpeedCaptureSession(surfaces, new CameraCaptureSession.StateCallback() {
        //mCameraDevice.createCaptureSession(surfaces, new CameraCaptureSession.StateCallback() {

            @Override
            public void onConfigured(CameraCaptureSession cameraCaptureSession) {
                //mPreviewSession = cameraCaptureSession;
                mPreviewSession2 = cameraCaptureSession;
                updatePreview();
            }

            @Override
            public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) {
                Activity activity = getActivity();
                if (null != activity) {
                    Toast.makeText(activity, "Failed", Toast.LENGTH_SHORT).show();
                }
            }
        }, mBackgroundHandler);
    } catch (CameraAccessException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}


/**
 * Update the camera preview. {@link #startPreview()} needs to be called in advance.
 */
private void updatePreview() {
    if (null == mCameraDevice) {
        return;
    }
    try {
        setUpCaptureRequestBuilder(mPreviewBuilder);
        HandlerThread thread = new HandlerThread("CameraPreview");
        thread.start();
        mPreviewBuilder2 =  mPreviewSession2.createHighSpeedRequestList(mPreviewBuilder.build());
        //mPreviewBuilder2 =


        //mPreviewSession.setRepeatingRequest(mPreviewBuilder.build(), null, mBackgroundHandler);
        mPreviewSession.setRepeatingBurst(mPreviewBuilder2, null, mBackgroundHandler);
    } catch (CameraAccessException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch(Exception e){
        e.printStackTrace();
    }
}

private void setUpCaptureRequestBuilder(CaptureRequest.Builder builder) {
    builder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
    Range<Integer> fpsRange = Range.create(120, 120);
    builder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, fpsRange);

}
Run Code Online (Sandbox Code Playgroud)

我可以毫无问题地将代码更新预览。不幸的是,从那里我在如何向 setRepeatingBurst 发出捕获请求方面遇到了障碍。我知道构造函数与示例的 setRepeatingRequest 不同。因此,我需要找到一种方法来给 setRepeatingBurst 我的表面、我的 CONTROL_MODE 请求和我的 TARGET_FPS_RANGE 请求。

/**
 * Camera preview.
 */
private CaptureRequest.Builder mPreviewBuilder;
List<CaptureRequest> mPreviewBuilder2;

/**
 * A reference to the current {@link android.hardware.camera2.CameraCaptureSession} for
 * preview.
 */
private CameraCaptureSession mPreviewSession;
private CameraConstrainedHighSpeedCaptureSession mPreviewSession2;
Run Code Online (Sandbox Code Playgroud)

任何帮助弄清楚如何正确地完成这项工作都会非常有帮助。我在网上没有找到太多可以提供帮助的信息,而且 StackOverflow 中也没有任何文章提到任何高速捕获功能。我这里最大的问题是试图了解 createConstrainedHighSpeedCaptureSession 如何提供 CameraConstrainedHighSpeedCaptureSession 会话。这样我就可以使用createHighSpeedRequestList。

sle*_*ort 4

我有一个类似的问题,但使用你的问题解决了它。

对于你的情况,我认为如果你打电话应该可以

mPreviewSession2.setRepeatingBurst(mPreviewBuilder2, null, mBackgroundHandler);
Run Code Online (Sandbox Code Playgroud)

代替

mPreviewSession.setRepeatingBurst(mPreviewBuilder2, null, mBackgroundHandler);
Run Code Online (Sandbox Code Playgroud)

因为您随后在 CameraConstrainedHighSpeedCaptureSession 上设置 RepeatingBurst


我制作了一个 github 存储库,展示了如何使用camera2 api 创建高速录制会话。

https://github.com/thesleort/Android-Slow-Motion-Camera2.git