在Android Camera2 API中,可以通过使用Surface来将相机图像数据传递给CPU/GPU进行处理,同时还可以将图像数据传递给MediaRecorder/MediaCodec进行录制或编码。
下面是一个示例代码,演示如何在同一管道中让CPU/GPU访问图像数据并将图像数据传递给MediaRecorder。
首先,需要设置相机的输出Surface和MediaRecorder的输出Surface:
// 创建相机预览的输出Surface
SurfaceTexture texture = mTextureView.getSurfaceTexture();
texture.setDefaultBufferSize(imageWidth, imageHeight);
Surface previewSurface = new Surface(texture);
// 创建MediaRecorder的输出Surface
mMediaRecorder = new MediaRecorder();
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mMediaRecorder.setOutputFile(outputFile.getAbsolutePath());
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
Surface recorderSurface = mMediaRecorder.getSurface();
然后,在CameraCaptureSession中创建预览请求,并在捕获图像时将图像数据传递给MediaRecorder的输出Surface:
// 创建预览请求,并将预览Surface和MediaRecorder的Surface添加到请求中
CaptureRequest.Builder previewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
previewRequestBuilder.addTarget(previewSurface);
previewRequestBuilder.addTarget(recorderSurface);
// 设置预览请求的其他参数,例如自动对焦和闪光灯
previewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
previewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
// 设置预览请求的回调,处理每个预览帧
CameraCaptureSession.CaptureCallback previewCallback = new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) {
// 在这里可以对预览帧进行CPU/GPU处理,例如图像滤镜
// ...
// 将图像数据传递给MediaRecorder的输出Surface
mMediaRecorder.captureFrame();
}
};
// 开始预览
mCameraCaptureSession.setRepeatingRequest(previewRequestBuilder.build(), previewCallback, null);
在onCaptureCompleted回调中,可以对预览帧进行CPU/GPU处理,例如应用图像滤镜或其他图像处理算法。然后,通过调用mMediaRecorder.captureFrame()方法,将处理后的图像数据传递给MediaRecorder的输出Surface。
请注意,上述示例代码只是一个基本的框架,实际开发中可能需要根据具体需求进行适当的修改和调整。