CameraCapturer должен быть инициализирован перед вызовом startCapture

Столкнувшись с этой проблемой при реализации WebRTC в Android:

Причина: java.lang.RuntimeException: CameraCapturer должен быть инициализирован перед вызовом startCapture.

build.gradle(:app)

dependencies {
  ......
  implementation 'org.webrtc:google-webrtc:1.0.+'
  ......
}

// Чанк, вызывающий проблему:

private void getVideoSource() {
    // isScreenCast = false
    videoSource = peerConnectionFactory.createVideoSource(false);
    surfaceTextureHelper = SurfaceTextureHelper.create(Thread.currentThread().getName(), rootEglBase.getEglBaseContext());
    VideoCapturer videoCapturer = createCameraCapturer(new Camera1Enumerator(false));
    localVideoTrack = peerConnectionFactory.createVideoTrack("200", videoSource);
    localVideoTrack.addSink(local_renderer);
    if(videoCapturer != null)
        videoCapturer.startCapture(1000,1000,30); // <- Here is the Exception

}

CameraCapturer считается устаревшим. Теперь доступен Camera1Capturer.


person Faizan Mubasher    schedule 10.04.2020    source источник


Ответы (1)


Вам нужно инициализировать, прежде чем использовать его

 private void getVideoSource() {
    VideoCapturer videoCapturer = createVideoCapturer();
    VideoSource videoSource;
    //Create a VideoSource instance
    if (videoCapturer != null) {
        SurfaceTextureHelper surfaceTextureHelper = SurfaceTextureHelper.create("CaptureThread", rootEglBase.getEglBaseContext());
        videoSource = factory.createVideoSource(videoCapturer.isScreencast());
        videoCapturer.initialize(surfaceTextureHelper, this, videoSource.getCapturerObserver());
    }
   

    localVideoTrack = factory.createVideoTrack("100", videoSource);

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

    //create an AudioSource instance
    audioSource = factory.createAudioSource(audioConstraints);
    localAudioTrack = factory.createAudioTrack("101", audioSource);

    if (videoCapturer != null) {
        videoCapturer.startCapture(1024, 720, 30);
    }
    binding.localGlSurfaceView.setVisibility(View.VISIBLE);
    // And finally, with our VideoRenderer ready, we
    // can add our renderer to the VideoTrack.
    localVideoTrack.addSink(binding.localGlSurfaceView);
}
person Shweta Chauhan    schedule 10.04.2020
comment
Спасибо. Можете ли вы подсказать мне, как использовать общедоступный IP-адрес устройства (предположим, он у меня от STUN Server) и сохранить его в SessionDescription? - person Faizan Mubasher; 15.04.2020
comment
Еще нет... Я все еще блуждаю, как сделать простой видеочат P2P без участия какого-либо сервера. Хотя я использую Firebase Messaging для отправки предложения и ответа. Но и это еще не завершено. - person Faizan Mubasher; 15.04.2020
comment
хорошо, позвольте мне поделиться некоторым кодом. Я поделюсь с вами ссылкой на github. Я недавно сделал эту работу. У нас есть один публичный сервер - person Shweta Chauhan; 15.04.2020
comment
@FaizanMubasher: для завершения моей демонстрации потребуется время, но вы можете проверить это github.com/IhorKlimov/Android-WebRtc - person Shweta Chauhan; 15.04.2020
comment
Спасибо! Очень признателен - person Faizan Mubasher; 15.04.2020
comment
Пример Kotlin – › github.com/ShwetaChauhan18/WebRTC-Android - person Shweta Chauhan; 15.04.2020
comment
Нужна помощь stackoverflow. ком/вопросы/58429603/ - person Faizan Mubasher; 16.04.2020