javaandroidwebrtcwebrtc-android

CameraCapturer must be initialized before calling startCapture


Facing this issue while implementing WebRTC in Android:

Caused by: java.lang.RuntimeException: CameraCapturer must be initialized before calling startCapture.

build.gradle(:app)

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

// Chunk causing problem:

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 is deprecated. There is Camera1Capturer now available.


Solution

  • You need to initialise before you use it

     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);
    }