Проблемы с mediaRecorder.setPreviewDisplay - неверная поверхность - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь создать приложение для потоковой передачи видео на Android Studio.Я хочу запустить мою видеокамеру и отправить данные на свой собственный сервер, который будет на ноутбуке.Но сначала я пытаюсь начать запись видео.

Я проследил за этим уроком https://developer.android.com/guide/topics/media/camera#java и у меня возникли некоторые проблемы.

Я установил для mediaRecorder камеру, аудио и видео источник, формат файла, профиль, выходной файл.Затем, когда я пытаюсь установить отображение предварительного просмотра (mediaRecorder.setPreviewDisplay( mPreview.getHolder().getSurface());), появляется следующая ошибка:

"E / MediaRecorderJNI: приложение потеряло поверхность"

Затем, когда я пытаюсь использовать mediaRecorder.prepare(), происходит сбой:

«недопустимая поверхность предварительного просмотра»

Переменная mPreview объявлена ​​как mPreview = new CameraPreview(this, mCamera);(где CameraPreview класс, представленный в ссылке выше).

Есть ли у вас какие-либо советы, как это предотвратить?Спасибо!

private boolean prepareVideoRecorder() {

    mCamera = getCameraInstance(whichCamera);
    mPreview = new CameraPreview(this, mCamera);
    FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
    preview.addView(mPreview);

    mediaRecorder = new MediaRecorder();

    // Step 1: Unlock and set camera to MediaRecorder
    mCamera.unlock();
    mediaRecorder.setCamera(mCamera);

    // Step 2: Set sources
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

    // Customise your profile based on a pre-existing profile
    CamcorderProfile profile = CamcorderProfile.get(Camera.CameraInfo.CAMERA_FACING_FRONT,CamcorderProfile.QUALITY_LOW);
    profile.fileFormat = MediaRecorder.OutputFormat.MPEG_4;
    profile.videoCodec = MediaRecorder.VideoEncoder.MPEG_4_SP;
    profile.videoFrameHeight = 240;
    profile.videoFrameWidth = 320;
    profile.videoBitRate = 15;

    // Apply to MediaRecorder
    mediaRecorder.setProfile(profile);

    // Step 3: Set a CamcorderProfile (requires API Level 8 or higher)
    // Step 4: Set output file      
        mediaRecorder.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString());

    // Step 5: Set the preview output
    **// 1: HERE I set the previewDisplay.**
    mediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());

    // Step 6: Prepare configured MediaRecorder
    try {
        **// 2: HERE will crash with "invalid surface preview"**
        mediaRecorder.prepare();
    } catch (IllegalStateException e) {
        Log.d(TAG, "IllegalStateException preparing MediaRecorder: " + e.getMessage());
        releaseMediaRecorder();
        return false;
    } catch (IOException e) {
        Log.d(TAG, "IOException preparing MediaRecorder: " + e.getMessage());
        releaseMediaRecorder();
        return false;
    }
    return true;
}
...