摄像服务记录
Camera service recording
我目前正在服务中使用 camera2 api 录制视频。
当预览表面被破坏时,我找不到更新相机会话输出列表的方法。换句话说:当一个表面被破坏时(例如,当 activity 进入后台时)要做什么以继续记录并避免由于空表面而导致崩溃。
这就是我开始录制视频的方式。
private void startRecordingVideo() {
if (null == mCameraDevice || null == mPreviewSize) {
return;
}
try {
closePreviewSession();
setUpMediaRecorder();
mPreviewBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
List<Surface> surfaces = new ArrayList<>();
if(mTextureView !=null) {
SurfaceTexture texture = mTextureView.getSurfaceTexture();
assert texture != null;
texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight()); // Set up Surface for the camera preview
previewSurface = new Surface(texture);
surfaces.add(previewSurface);
mPreviewBuilder.addTarget(previewSurface);
}
// Set up Surface for the MediaRecorder
Surface recorderSurface = mMediaRecorder.getSurface();
surfaces.add(recorderSurface);
mPreviewBuilder.addTarget(recorderSurface);
// Start a capture session
// Once the session starts, we can update the UI and start recording
mCameraDevice.createCaptureSession(surfaces, new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {
mPreviewSession = cameraCaptureSession;
updatePreview();
mMediaRecorder.start();
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) {
Timber.e("Error when creating captureSession");
}
}, mBackgroundHandler);
} catch (CameraAccessException | IOException e) {
e.printStackTrace();
}
}
当我将 activity 发送到后台时:预览表面被破坏,这是我挣扎的地方。我应该如何更新我的捕获会话,以便在不停止正在进行的捕获的情况下从会话输出中删除预览表面?
如果您不想让预览再次工作,您可以简单地创建一个新的预览请求,而不是在 TextureView 消失后将 previewSurface 添加到其中。
如果您想稍后不间断地连接预览,那就更复杂了。一种选择是从您自己的 SurfaceTexture 开始,并将其 attachToGlContext/detachFromGlContext 调用与 GLSurfaceView 或类似的一起使用。
然后您可以使用 SurfaceTexture 配置会话,并且无论何时您想要显示预览,将其附加到 GLSurfaceView 的 GL 上下文并将 Surface 添加到您的预览请求目标。然后当你想停止显示预览时,从预览目标中删除 Surface,并将它从 GLSurfaceView 中分离。
这需要您自己的 GL 绘图代码(基本上是您自己的具有自定义行为的迷你 TextureView),因此它有很多样板,但它是简单的 EGL(只需要绘制一个带有预览纹理的四边形)。
我目前正在服务中使用 camera2 api 录制视频。
当预览表面被破坏时,我找不到更新相机会话输出列表的方法。换句话说:当一个表面被破坏时(例如,当 activity 进入后台时)要做什么以继续记录并避免由于空表面而导致崩溃。
这就是我开始录制视频的方式。
private void startRecordingVideo() {
if (null == mCameraDevice || null == mPreviewSize) {
return;
}
try {
closePreviewSession();
setUpMediaRecorder();
mPreviewBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
List<Surface> surfaces = new ArrayList<>();
if(mTextureView !=null) {
SurfaceTexture texture = mTextureView.getSurfaceTexture();
assert texture != null;
texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight()); // Set up Surface for the camera preview
previewSurface = new Surface(texture);
surfaces.add(previewSurface);
mPreviewBuilder.addTarget(previewSurface);
}
// Set up Surface for the MediaRecorder
Surface recorderSurface = mMediaRecorder.getSurface();
surfaces.add(recorderSurface);
mPreviewBuilder.addTarget(recorderSurface);
// Start a capture session
// Once the session starts, we can update the UI and start recording
mCameraDevice.createCaptureSession(surfaces, new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {
mPreviewSession = cameraCaptureSession;
updatePreview();
mMediaRecorder.start();
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) {
Timber.e("Error when creating captureSession");
}
}, mBackgroundHandler);
} catch (CameraAccessException | IOException e) {
e.printStackTrace();
}
}
当我将 activity 发送到后台时:预览表面被破坏,这是我挣扎的地方。我应该如何更新我的捕获会话,以便在不停止正在进行的捕获的情况下从会话输出中删除预览表面?
如果您不想让预览再次工作,您可以简单地创建一个新的预览请求,而不是在 TextureView 消失后将 previewSurface 添加到其中。
如果您想稍后不间断地连接预览,那就更复杂了。一种选择是从您自己的 SurfaceTexture 开始,并将其 attachToGlContext/detachFromGlContext 调用与 GLSurfaceView 或类似的一起使用。
然后您可以使用 SurfaceTexture 配置会话,并且无论何时您想要显示预览,将其附加到 GLSurfaceView 的 GL 上下文并将 Surface 添加到您的预览请求目标。然后当你想停止显示预览时,从预览目标中删除 Surface,并将它从 GLSurfaceView 中分离。
这需要您自己的 GL 绘图代码(基本上是您自己的具有自定义行为的迷你 TextureView),因此它有很多样板,但它是简单的 EGL(只需要绘制一个带有预览纹理的四边形)。