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 启动并删除表面。
我试过把它变成一个像帖子建议的成员变量,但错误仍然存在。使用上述分辨率的其他人似乎解决了这个问题,但它对我的不起作用。
对此有何见解?谢谢!