Android camera2 在牛轧糖上废弃了表面,但在棉花糖上工作

Swi*_*ter 5 java android android-camera2 android-7.0-nougat

编辑 05/05/2018
我仍然不知道发生这种情况的原因,但显然它不会影响 Lolipop 和 Marshmallow 设备。据我测试,此错误仅出现在 Nougat 7.0 上。


我正在制作一个应用程序,可让您录制视频,然后用于进一步处理。但是,我目前在录制部分遇到了问题。

设置/开始录制的代码:

private void startRecord()
{
    mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    mediaRecorder.setOutputFile(videoFile.getAbsolutePath());
    mediaRecorder.setVideoEncodingBitRate(1000000);
    mediaRecorder.setVideoFrameRate(30);
    mediaRecorder.setVideoSize(videoSize.getWidth(), videoSize.getHeight());
    mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
    mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
    mediaRecorder.setOrientationHint(totalRotation);

    try
    {
        mediaRecorder.prepare();

        SurfaceTexture surfaceTexture = textureView.getSurfaceTexture();
        surfaceTexture.setDefaultBufferSize(previewSize.getWidth(), previewSize.getHeight());
        Surface previewSurface = new Surface(surfaceTexture);
        Surface recordSurface = mediaRecorder.getSurface();
        captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
        captureRequestBuilder.addTarget(previewSurface);
        captureRequestBuilder.addTarget(recordSurface);

        cameraDevice.createCaptureSession(Arrays.asList(previewSurface, recordSurface),
                new CameraCaptureSession.StateCallback()
                {
                    @Override
                    public void onConfigured(CameraCaptureSession session)
                    {
                        recordCaptureSession = session;
                        try
                        {
                            recordCaptureSession.setRepeatingRequest(captureRequestBuilder.build(), null, null);
                        }
                        catch (CameraAccessException e) {}
                    }

                    @Override
                    public void onConfigureFailed(CameraCaptureSession session) {}
                }, null);
    }
    catch (IOException ioEx) {} // mediaRecorder.prepare()
    catch (CameraAccessException caEx) {} // cameraDevice.createCaptureSession()
}
Run Code Online (Sandbox Code Playgroud)

特别是在cameraDevice.createCaptureSession()方法上,问题在于recordSurface被放弃,从而扔IllegalArgumentException在那条线上。

我读过一些关于这个问题的帖子,大多数人说这是由于变量超出范围导致 GC 启动并删除表面。

我试过把它变成一个像帖子建议的成员变量,但错误仍然存​​在。使用上述分辨率的其他人似乎解决了这个问题,但它对我的不起作用。

对此有何见解?谢谢!