高速捕获请求Android Marshmallow

5
我遇到了一些设置高速视频捕获请求的问题。我打算在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);

}

我没有问题更新预览的代码。不幸的是,我遇到了困难,不知道如何给setRepeatingBurst设置我的捕获请求。我知道构造函数与示例的setRepeatingRequest不同。因此,我需要找到一种方式将我的surfaces,CONTROL_MODE请求和TARGET_FPS_RANGE请求传递给setRepeatingBurst。
/**
 * 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;

任何帮助我弄清如何使其正确工作的建议都将非常有用。我在网上没有找到太多帮助,StackOverflow中也没有提到任何高速捕获功能的文章。我的最大问题是尝试理解createConstrainedHighSpeedCaptureSession如何提供CameraConstrainedHighSpeedCaptureSession会话,以便我可以使用createHighSpeedRequestList。
1个回答

4

我有类似的问题,但是通过你的问题已经解决了。

在你的情况下,如果调用以下代码应该可以解决:

mPreviewSession2.setRepeatingBurst(mPreviewBuilder2, null, mBackgroundHandler);

相较于

mPreviewSession.setRepeatingBurst(mPreviewBuilder2, null, mBackgroundHandler);

由于您正在将RepeatingBurst设置为CameraConstrainedHighSpeedCaptureSession,因此需要进行翻译。


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

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


有时候,使用更加详细的变量名称会有所帮助。 - sleort
1
我现在无法访问它,但我设法使其工作。我可以在本周晚些时候将其放在git存储库中,然后在此处链接 :) - sleort
1
我会将它推送到这个 https://github.com/thesleort/Android-Slow-Motion-Camera2.git。 - sleort
默认情况下,我让它选择所选分辨率的最高可用fps。然而,如果您想明确更改它,则可以取消注释第635行并“注释掉”第636行。运行应用程序时,它将打印可用的fps范围。您可以从这些范围中选择任何一个。在我的Nexus 6P上,可用以下范围:[30,120],[30,240],[120,240],[240,240]。第一个数字是预览帧速率,最后一个数字是捕获帧速率。 - sleort
1
我猜如果你在另一个线程中进行录制,这是可能的。当你开始录制时,视频文件将出现在所选目录中。您可以在录制时访问此不断增长的视频。如果您有一些框架来修改/编辑视频,则应该能够这样做。请记住,这将需要大量的内存带宽,因为手机也在使用相机。您可能会遇到高速捕获和同时编辑的瓶颈。当然,所有这些都取决于硬件,因此结果可能因设备而异。 - sleort
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接