Использование Webrt c для потоковой передачи с получением этой ошибки «Не удается запустить уже запущенный MediaProjection» - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть два сценария,

  1. Чтобы наложить мой экран таким образом, чтобы происходило потоковое воспроизведение (работает нормально)
  2. При совместном использовании экрана я должен записать и сохранить его в формате mp4 т.е. на внешнем хранилище. Вот где я получаю эту ошибку.

  3. Для потоковой передачи я использую ScreenCapturer Android, который внутренне вызывает getMediaProjection (resultCode, data) для запуска захвата экрана.

  4. Я использую MediaRecorder для записи и сохранения захваченного видео в формате mp4. И при вызове mProjectionManager.getMediaProjection (resultCode, data); Я получаю эту ошибку.

    java.lang.IllegalStateException: Cannot start already started MediaProjection

Вот мой код

  @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode != CAPTURE_PERMISSION_REQUEST_CODE) {
            Log.d("WebR", String.valueOf(CAPTURE_PERMISSION_REQUEST_CODE));
            return;
        }
        mMediaProjectionPermissionResultCode = resultCode;
        mMediaProjectionPermissionResultData = data;
        Log.d("WebR", "ReqCode" + String.valueOf(requestCode));
        Log.d("WebR", "ResCode" + String.valueOf(resultCode));
        Log.d("WebR", "ResData" + String.valueOf(data));
        init();
        mMediaProjection = mProjectionManager.getMediaProjection(resultCode, data);

        mVirtualDisplay = createVirtualDisplay();
        mMediaRecorder.start();
    }

    private void init() {
        PeerConnectionClient.PeerConnectionParameters peerConnectionParameters =
                new PeerConnectionClient.PeerConnectionParameters(true, false,
                        true, sDeviceWidth / SCREEN_RESOLUTION_SCALE, sDeviceHeight / SCREEN_RESOLUTION_SCALE, 0,
                        0, "VP8",
                        false,
                        true,
                        0,
                        "OPUS", false, false, false, false, false, false, false, false, null);
//        mWebRtcClient = new WebRtcClient(getApplicationContext(), this, pipRenderer, fullscreenRenderer, createScreenCapturer(), peerConnectionParameters);

        if(createScreenCapturer() == null) {
            return;
        } else {
            mWebRtcClient = new WebRtcClient(getApplicationContext(), this, createScreenCapturer(), peerConnectionParameters);
        }
    }

    @TargetApi(21)
    private VideoCapturer createScreenCapturer() {
        if (mMediaProjectionPermissionResultCode != Activity.RESULT_OK) {
            report("User didn't give permission to capture the screen.");
            Log.d("WebR", "user didn't give permission");
            return null;
        }
        Log.d("WebR", "user gave permission");

        return new ScreenCapturerAndroid(
                mMediaProjectionPermissionResultData, new MediaProjection.Callback() {
            @Override
            public void onStop() {
                report("User revoked permission to capture the screen.");
            }
        });
    }


    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    private VirtualDisplay createVirtualDisplay() {
        return mMediaProjection.createVirtualDisplay("MainActivity",
                DISPLAY_WIDTH, DISPLAY_HEIGHT, mScreenDensity,
                DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
                mMediaRecorder.getSurface(), null /*Callbacks*/, null
                /*Handler*/);
    }
...