Я завершил обмен потоками с камеры через приложение webrt c в Android, но теперь мне нужно поделиться экраном с удаленным узлом - PullRequest
0 голосов
/ 09 июля 2020

Мне удалось разработать приложение для потоковой передачи с камеры, используя WEBRT C. Подключены два одноранговых узла. Одно из них - приложение android, другое - браузер. Я сделал это с помощью этого руководства. https://vivekc.xyz/getting-started-with-webrtc-for-android-daab1e268ff4 (Поделитесь этим на случай, если кому-то нужна хорошая документация по web rt c). Теперь я хочу поделиться экраном вместо потоков с камеры.

Я пробовал сделать это с помощью Media Projection API. Но после использования этого API весь экран становится черным, а также некорректно выполняется sdp. Кто-нибудь может мне с этим помочь. Я попытался сделать это с помощью.

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().addFlags(
            WindowManager.LayoutParams.FLAG_FULLSCREEN
                    | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                    | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                    | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                    | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
    setContentView(R.layout.webrtc_layout);
    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getRealMetrics(metrics);
    sDeviceWidth = metrics.widthPixels;
    sDeviceHeight = metrics.heightPixels;

    try{
        context = this;

        SignallingClient.getInstance().setChannelId("GINGER_1594035215_551_6336_THINK_1");

        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
                != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO)
                != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA,
                    Manifest.permission.RECORD_AUDIO}, ALL_PERMISSIONS_CODE);
        }
        else if  (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            startScreenCapture();
        }
        else {
            // all permissions already granted
            start();
        }
    } catch (Exception e){
        e.printStackTrace();
    }



}

@TargetApi(21)
private void startScreenCapture() {
    MediaProjectionManager mediaProjectionManager =
            (MediaProjectionManager) getApplication().getSystemService(
                    Context.MEDIA_PROJECTION_SERVICE);
    startActivityForResult(
            mediaProjectionManager.createScreenCaptureIntent(), CAPTURE_PERMISSION_REQUEST_CODE);
}

@TargetApi(21)
private VideoCapturer createScreenCapturer() {
    if (mMediaProjectionPermissionResultCode != Activity.RESULT_OK) {
        showToast("User didn't give permission to capture the screen.");
        return null;
    }
    return new ScreenCapturerAndroid(
            mMediaProjectionPermissionResultData, new MediaProjection.Callback() {
        @Override
        public void onStop() {
            showToast("User revoked permission to capture the screen.");
        }
    });
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode != CAPTURE_PERMISSION_REQUEST_CODE)
        return;
    mMediaProjectionPermissionResultCode = resultCode;
    mMediaProjectionPermissionResultData = data;
    start();
}

Затем я добавил снимок экрана android в видеозахват, где были добавлены более ранние потоки камеры. Но это бесполезно.

    //Now create a VideoCapturer instance.
        VideoCapturer videoCapturerAndroid;
        videoCapturerAndroid=createScreenCapturer();
        //videoCapturerAndroid = createCameraCapturer(new Camera1Enumerator(false));

Кто-нибудь может мне с этим помочь?

1 Ответ

0 голосов
/ 28 июля 2020

Я сам смог ответить на вопрос. Я делюсь кодом. Надеюсь, это будет полезно для всех, кто работает над тем же проектом.

  Add this code in Oncreate
  
   requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().addFlags(
            WindowManager.LayoutParams.FLAG_FULLSCREEN
                    | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                    | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                    | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                    | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
    setContentView(R.layout.webrtc_layout);
    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getRealMetrics(metrics);
    sDeviceWidth = metrics.widthPixels;
    sDeviceHeight = metrics.heightPixels;

Затем создайте средство захвата экрана, используя его и вызовите его в начале после проверки разрешений.

 @TargetApi(21)
private void startScreenCapture() {
    MediaProjectionManager mediaProjectionManager =
            (MediaProjectionManager) getApplication().getSystemService(
                    Context.MEDIA_PROJECTION_SERVICE);
    startActivityForResult(
            mediaProjectionManager.createScreenCaptureIntent(), CAPTURE_PERMISSION_REQUEST_CODE);
}

@TargetApi(21)
private VideoCapturer createScreenCapturer() {
    if (mMediaProjectionPermissionResultCode != Activity.RESULT_OK) {
        showToast("User didn't give permission to capture the screen.");
        return null;
    }
    return new ScreenCapturerAndroid(
            mMediaProjectionPermissionResultData, new MediaProjection.Callback() {
        @Override
        public void onStop() {
            showToast("User revoked permission to capture the screen.");
        }
    });
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode != CAPTURE_PERMISSION_REQUEST_CODE)
        return;
    mMediaProjectionPermissionResultCode = resultCode;
    mMediaProjectionPermissionResultData = data;
    start();
}

Добавить средство захвата экрана вернуться в Video Capturer

  videoCapturerAndroid=createScreenCapturer();
        //videoCapturerAndroid = createCameraCapturer(new Camera1Enumerator(false));

        //Create MediaConstraints - Will be useful for specifying video and audio constraints.
        audioConstraints = new MediaConstraints();
        videoConstraints = new MediaConstraints();



        //Create a VideoSource instance
        if (videoCapturerAndroid != null) {
            surfaceTextureHelper = SurfaceTextureHelper.create("CaptureThread", rootEglBase.getEglBaseContext());
            videoSource = peerConnectionFactory.createVideoSource(videoCapturerAndroid.isScreencast());
            videoCapturerAndroid.initialize(surfaceTextureHelper, this, videoSource.getCapturerObserver());
        }

Теперь вы готовы к go. Он будет отлично работать до Android 9. Не переживайте, если вы хотите использовать его в android 10. Просто добавьте это в службе переднего плана и всегда показывать уведомление при включенном зеркальном отображении экрана, и это будет работать идеально.

...