Двойной захват видео - Google Pixel 4 - PullRequest
0 голосов
/ 18 марта 2020

У меня есть 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();
    }

}
...