У меня есть Google Pixel 4, и я изо всех сил пытаюсь создать приложение, которое захватывает 2 видео одновременно, по одному с каждой из камер, расположенных сзади.
Я могу легко получить захват видео с обеих камер для предварительный просмотр на экране с использованием 2 TextureView, но когда я использую класс MediaRecorder, чтобы попытаться записать 2 видео сразу, приложение падает после нескольких секунд записи без сообщения об ошибке на консоль.
Кто-нибудь пытался сделать это раньше или есть какие-нибудь идеи для меня попробовать?
Вот проект, расширенный с примера googles camera2 для захвата видео: https://github.com/The-TT-Hacker/Camera2DualCameraCapture
Вот код для настройка медиа-рекордера и запуск захвата видео:
private void setUpMediaRecorder(MediaRecorder mMediaRecorder, String num) throws IOException {
final Activity activity = getActivity();
if (null == activity) {
return;
}
//mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
mMediaRecorder.setVideoEncodingBitRate(10000000);
mMediaRecorder.setVideoFrameRate(30);
mMediaRecorder.setVideoSize(mVideoSize.getWidth(), mVideoSize.getHeight());
mMediaRecorder.setOutputFile(getVideoFilePath(getActivity(), num));
//mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
switch (mSensorOrientation) {
case SENSOR_ORIENTATION_DEFAULT_DEGREES:
mMediaRecorder.setOrientationHint(DEFAULT_ORIENTATIONS.get(rotation));
break;
case SENSOR_ORIENTATION_INVERSE_DEGREES:
mMediaRecorder.setOrientationHint(INVERSE_ORIENTATIONS.get(rotation));
break;
}
mMediaRecorder.prepare();
}
private void startRecordingVideo() {
if (null == mCameraDevice || !mTextureView.isAvailable() || null == mPreviewSize) {
return;
}
try {
closePreviewSession();
setUpMediaRecorder(mMediaRecorder1, "1");
setUpMediaRecorder(mMediaRecorder2, "2");
SurfaceTexture texture = mTextureView.getSurfaceTexture();
assert texture != null;
texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
// Set up Surface for the camera preview
Surface previewSurface = new Surface(texture);
// Set up Surface for the MediaRecorder
Surface recorderSurface1 = mMediaRecorder1.getSurface();
Surface recorderSurface2 = mMediaRecorder2.getSurface();
OutputConfiguration config1 = new OutputConfiguration(previewSurface);
config1.setPhysicalCameraId("3");
OutputConfiguration config2 = new OutputConfiguration(recorderSurface1);
config2.setPhysicalCameraId("3");
OutputConfiguration config3 = new OutputConfiguration(recorderSurface2);
config3.setPhysicalCameraId("4");
List<OutputConfiguration> outputConfigs = new ArrayList<>();
outputConfigs.add(config1);
outputConfigs.add(config2);
outputConfigs.add(config3);
mPreviewBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
mPreviewBuilder.addTarget(previewSurface);
mPreviewBuilder.addTarget(recorderSurface1);
mPreviewBuilder.addTarget(recorderSurface2);
// Start a capture session
// Once the session starts, we can update the UI and start recording
SessionConfiguration sessionConfig = new SessionConfiguration(SessionConfiguration.SESSION_REGULAR, outputConfigs, AsyncTask.THREAD_POOL_EXECUTOR, new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {
mPreviewSession = cameraCaptureSession;
updatePreview();
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
// UI
mButtonVideo.setText(R.string.stop);
mIsRecordingVideo = true;
// Start recording
mMediaRecorder1.start();
mMediaRecorder2.start();
}
});
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) {
Activity activity = getActivity();
if (null != activity) {
Toast.makeText(activity, "Failed", Toast.LENGTH_SHORT).show();
}
}
});
mCameraDevice.createCaptureSession(sessionConfig);
} catch (CameraAccessException | IOException e) {
e.printStackTrace();
}
}