webrtc-java icon indicating copy to clipboard operation
webrtc-java copied to clipboard

Quick question about video streaming

Open RaniRaven opened this issue 3 years ago • 6 comments

I am trying to follow the path in the tests that allows for streaming actual video into the peer. I am getting to the stage where both peers are connected, each is setting right the SDP offer and answer to the remote and local. The webrtc session is up for sure, but nothing is being streamed. I am probably missing something trivial, but I cannot understand what is supposed to be the "streamer" that actually streams the video. Unfortunately there is no test showing this including video, only data channel is being illustrated, Isn't there supposed to be an event loop which makes the streaming of video frames there ? or is it done by the native functions behind the scenes, like by the call to the VideoSource.start() ?

Can someone shed some light on it ? Cause I think I am quite close to success there.

RaniRaven avatar Nov 16 '21 10:11 RaniRaven

Unfortunately there is no test showing this including video, only data channel is being illustrated

That's because the tests must be able to run on headless servers which have no cameras or microphones connected.

As of now, you can stream webcams. Custom video sources is doable too, but haven't done that so far.

Have a look at the code snippets in #25. Once you call videoSource.start() your webcam should turn on.

devopvoid avatar Nov 16 '21 10:11 devopvoid

I must be missing something , as this is my implementation : void TestVideoRTC() throws Exception { //TestPeerConnection caller = new TestPeerConnection(factory); TestPeerConnection callee = new TestPeerConnection(factory);

	// set video
	VideoDeviceSource videoSource = new VideoDeviceSource();
	videoSource.setVideoCaptureDevice(MediaDevices.getVideoCaptureDevices().get(0));
	VideoTrack videoTrack = factory.createVideoTrack("videoTrack", videoSource);

	List<String> streamIds = new ArrayList<>();
	streamIds.add("stream-0");

	// config
	RTCIceServer iceServer = new RTCIceServer();
	iceServer.urls.add("stun:stun.l.google.com:19302");

	RTCConfiguration config = new RTCConfiguration();
	config.iceServers.add(iceServer);
	config.bundlePolicy = RTCBundlePolicy.MAX_BUNDLE;
	config.rtcpMuxPolicy = RTCRtcpMuxPolicy.NEGOTIATE;
	config.iceTransportPolicy = RTCIceTransportPolicy.ALL;
	TestPeerConnection caller = new TestPeerConnection(factory, config);

	callee.setRemotePeerConnection(caller);
	caller.setRemotePeerConnection(callee);

    RTCRtpSender videoSender = caller.getPeerConnection().addTrack(videoTrack, streamIds);


	//factory.createPeerConnection(config, null);

	caller.getPeerConnection().setConfiguration(config);
	RTCSessionDescription goodOffer = null;
	TestCreateDescObserver callerObserver = new TestCreateDescObserver();
	caller.getPeerConnection().createOffer(new RTCOfferOptions(), callerObserver);
	goodOffer = callerObserver.get();
	RTCSessionDescription offer = caller.getPeerConnection().getRemoteDescription();
	caller.getPeerConnection().setLocalDescription(goodOffer, new TestSetDescObserver());
	callee.setRemoteDescription(goodOffer); //getPeerConnection().setRemoteDescription(offer,null);
	RTCSessionDescription goodAnswer = null;
	TestCreateDescObserver calleeObserver = new TestCreateDescObserver();
	callee.getPeerConnection().createAnswer(new RTCAnswerOptions(), calleeObserver);
	goodAnswer = calleeObserver.get();
	callee.getPeerConnection().setLocalDescription(goodAnswer, new TestSetDescObserver());
	goodAnswer = calleeObserver.get();
	RTCSessionDescription answer = callee.getPeerConnection().getLocalDescription();
	System.out.println("Caller state :  " + caller.getPeerConnection().getConnectionState());
	System.out.println("Callee state :  " + callee.getPeerConnection().getConnectionState());
	callee.getPeerConnection().setLocalDescription(goodAnswer, new TestSetDescObserver());
	caller.setRemoteDescription(goodAnswer); //getPeerConnection().setRemoteDescription(answer, null);

	//caller.setRemotePeerConnection(callee);
	//callee.setRemotePeerConnection(caller);

	//callee.setRemoteDescription(caller.createOffer());
	//caller.setRemoteDescription(callee.createAnswer());
	RTCRtpTransceiverInit init = new RTCRtpTransceiverInit();
	init.direction = RTCRtpTransceiverDirection.RECV_ONLY;

	VideoDeviceSource videoSource1 = new VideoDeviceSource();
	VideoTrack track1 = factory.createVideoTrack("videoTrack", videoSource);
	VideoTrackSink sink = new VideoTrackSink() {
		@Override
		public void onVideoFrame(VideoFrame frame) {
			System.out.println("Got frame : " + frame.toString());
		}
	};
	init.streamIds = streamIds;
	RTCRtpTransceiver transceiver = callee.getPeerConnection().addTransceiver(track1, init);

	System.out.println("Caller state :  " + caller.getPeerConnection().getConnectionState());
	System.out.println("Callee state :  " + callee.getPeerConnection().getConnectionState());

	//transceiver.

	try {
		caller.waitUntilConnected();
		callee.waitUntilConnected();
	} catch (InterruptedException exc) {
		System.out.println("Got interupted : " + exc.getStackTrace());
	}
	System.out.println("Caller state :  " + caller.getPeerConnection().getConnectionState());
	System.out.println("Callee state :  " + callee.getPeerConnection().getConnectionState());

	try {
		videoSource.start();
		System.out.println("[Start] Caller state :  " + caller.getPeerConnection().getConnectionState());
		System.out.println("[Start] Callee state :  " + callee.getPeerConnection().getConnectionState());
	} catch (Exception exc) {
		System.out.println("Exc : " + exc.getMessage() +  "  - " + exc.getStackTrace());
	}

	Thread.sleep(1500);



	/*caller.sendTextMessage("Hello world");
	callee.sendTextMessage("Hi :)");

	Thread.sleep(500);

	assertEquals(List.of("Hello world"), callee.getReceivedTexts());
	assertEquals(List.of("Hi :)"), caller.getReceivedTexts());*/

	caller.close();
	callee.close();
}

For some reason everything is connected but I am not getting the frames of the video at the callee. What am I missing here, as I followed all the steps in the sample ?

RaniRaven avatar Nov 16 '21 16:11 RaniRaven

Hi @RaniRaven, did you manage to run your example successfully? Maybe the timeout Thread.sleep(1500); is too short.

devopvoid avatar Nov 26 '21 11:11 devopvoid

No actually I get a weird problem that the track is LIVE on both side (both peers) but I don;t get the onframe event. Now I tried to upgrade to the 0.5.0 version of the dll (pom), and all crashes.

RaniRaven avatar Dec 14 '21 09:12 RaniRaven

I've good news now, I have finally been able to set a working sample there. Currently working in the model of ICE gathering all. I'll see about the full trickling model, later. I am still a little bit confused about setting the audio stream, since the model is not clear there, how do I start ? Is there any sample by the way of how to stream a file from a filesystem using those sources ?

RaniRaven avatar Dec 14 '21 12:12 RaniRaven

@RaniRaven any updates yet on this ?

kinsleykajiva avatar May 15 '22 09:05 kinsleykajiva

Streaming a file is not supported yet, but will be possible in the near future. For upcoming progress see #87

devopvoid avatar Nov 14 '22 15:11 devopvoid