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

Video cannot be obtained from the SRS service

Open skill7899 opened this issue 1 year ago • 2 comments

Describe the bug A clear and concise description of what the bug is.

To Reproduce Steps to reproduce the behavior:

https://ossrs.io/lts/en-us/docs/v5/doc/getting-started run

CANDIDATE="your localip" docker run --rm -it -p 1935:1935 -p 1985:1985 -p 8080:8080
--env CANDIDATE=$CANDIDATE -p 8000:8000/udp
registry.cn-hangzhou.aliyuncs.com/ossrs/srs:5 ./objs/srs -c conf/rtc.conf

i start the video from web, http://localhost:8080/players/rtc_publisher.html?schema=http web push video to srs, webrtc-java connect to srs and pull the video,but fail。nothing get it

/*
 * Copyright 2019 Alex Andres
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.example.webrtc;


import dev.onvoid.webrtc.*;
import dev.onvoid.webrtc.media.MediaStreamTrack;
import dev.onvoid.webrtc.media.MediaStreamTrackMuteListener;
import dev.onvoid.webrtc.media.audio.AudioOptions;
import dev.onvoid.webrtc.media.audio.AudioTrackSink;
import dev.onvoid.webrtc.media.audio.AudioTrackSource;
import dev.onvoid.webrtc.media.audio.AudioTrack;
import dev.onvoid.webrtc.media.video.VideoDeviceSource;
import dev.onvoid.webrtc.media.video.VideoFrame;
import dev.onvoid.webrtc.media.video.VideoTrack;
import dev.onvoid.webrtc.media.video.VideoTrackSink;
import lombok.Getter;
import lombok.Setter;
import org.springframework.web.client.RestTemplate;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import static dev.onvoid.webrtc.RTCRtcpMuxPolicy.NEGOTIATE;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;


class RTCPeerConnectionTests {


	protected PeerConnectionFactory factory;



	private RTCPeerConnection peerConnection;


	private RestTemplate restTemplate;


	void init() {

	}

	void dispose() {
		peerConnection.close();
	}

	public static void main(String[] args) {
		new RTCPeerConnectionTests().configuration();
	}
	void  configuration() {
		restTemplate = new RestTemplate();
		factory = new PeerConnectionFactory();
		RTCConfiguration config = new RTCConfiguration();
		PeerConnectionObserver observer = candidate -> {};

		peerConnection = factory.createPeerConnection(config, observer);
                addRecvOnlyAudioTransceiver();
		addRecvOnlyVideoTransceiver();

		Data data = new Data();
		RTCOfferOptions rtcOfferOptions = new RTCOfferOptions();
		//rtcOfferOptions.iceRestart =  true;
		peerConnection.createOffer(rtcOfferOptions, new CreateSessionDescriptionObserver() {
			@Override
			public void onSuccess(RTCSessionDescription description) {
				peerConnection.setLocalDescription(description, new SetSessionDescriptionObserver() {
					@Override
					public void onSuccess() {
						System.out.println("成功");

					}

					@Override
					public void onFailure(String error) {
						System.out.println("失败:" + error);
					}
				});
				data.setApi("http://localhost:1985/rtc/v1/play/");
				data.setSdp(description.sdp.toString());
				data.setStreamurl("webrtc://localhost/live/livestream");
				data.setTid("5705199");
				Map answer = restTemplate.postForObject("http://localhost:1985/rtc/v1/play/", data, Map.class);

				peerConnection.setRemoteDescription(new RTCSessionDescription(RTCSdpType.ANSWER, answer.get("sdp").toString()), new SetSessionDescriptionObserver() {
					@Override
					public void onSuccess() {
						System.out.println("成功接上");

					}

					@Override
					public void onFailure(String error) {
						System.out.println("失败了:" + error);
					}
				});
			}

			@Override
			public void onFailure(String error) {
				System.out.println("失败" + error);
			}
		});

		try {
			Thread.sleep(1000000);
		} catch (InterruptedException e) {
			throw new RuntimeException(e);
		}
		peerConnection.close();
	}
	@Setter
	@Getter
	public static class Data{
		String api;
		String streamurl;
		String sdp;
		String tid;
		String clientip;
	}

	void addTrack() {
		AudioTrackSource audioSource = factory.createAudioSource(new AudioOptions());
		AudioTrack audioTrack = factory.createAudioTrack("audioTrack", audioSource);
		audioTrack.addSink(new AudioTrackSink() {
			@Override
			public void onData(byte[] data, int bitsPerSample, int sampleRate, int channels, int frames) {
				System.out.println(data);
			}
		});
		VideoDeviceSource videoSource = new VideoDeviceSource();
		VideoTrack videoTrack = factory.createVideoTrack("videoTrack", videoSource);
		videoTrack.addSink(new VideoTrackSink() {
			@Override
			public void onVideoFrame(VideoFrame frame) {
				System.out.println(frame.timestampNs);
			}
		});
		List<String> streamIds = new ArrayList<>();
		streamIds.add("stream-0");

		RTCRtpSender audioSender = peerConnection.addTrack(audioTrack, streamIds);
		RTCRtpSender videoSender = peerConnection.addTrack(videoTrack, streamIds);

		RTCRtpSender[] senders = peerConnection.getSenders();
		RTCRtpReceiver[] receivers = peerConnection.getReceivers();
		for (RTCRtpReceiver receiver : receivers) {
			receiver.getTrack().addTrackMuteListener(new MediaStreamTrackMuteListener() {
				@Override
				public void onTrackMute(MediaStreamTrack track, boolean muted) {
					System.out.println(1111);
				}
			});
		}

	}
	void addRecvOnlyVideoTransceiver() {
		VideoDeviceSource videoSource = new VideoDeviceSource();
		VideoTrack track = factory.createVideoTrack("videoTrack", videoSource);
		track.addSink(new VideoTrackSink() {
			@Override
			public void onVideoFrame(VideoFrame frame) {
				System.out.println(1111);
			}
		});
		RTCRtpTransceiverInit init = new RTCRtpTransceiverInit();
		init.direction = RTCRtpTransceiverDirection.RECV_ONLY;

		RTCRtpTransceiver transceiver = peerConnection.addTransceiver(track, init);
		transceiver.getReceiver().getTrack().addTrackMuteListener(new MediaStreamTrackMuteListener() {
			@Override
			public void onTrackMute(MediaStreamTrack track, boolean muted) {
				System.out.println(1111);
			}
		});
	}

	void addRecvOnlyAudioTransceiver() {
		AudioTrackSource audioSource = factory.createAudioSource(new AudioOptions());
		AudioTrack track = factory.createAudioTrack("audioTrack", audioSource);
		track.addSink(new AudioTrackSink() {
			@Override
			public void onData(byte[] data, int bitsPerSample, int sampleRate, int channels, int frames) {
				System.out.println(data);
			}
		});
		RTCRtpTransceiverInit init = new RTCRtpTransceiverInit();
		init.direction = RTCRtpTransceiverDirection.RECV_ONLY;

		RTCRtpTransceiver transceiver = peerConnection.addTransceiver(track, init);

	}

	void addAudioTransceiver() {
		AudioTrackSource audioSource = factory.createAudioSource(new AudioOptions());
		AudioTrack track = factory.createAudioTrack("audioTrack", audioSource);
		track.addSink(new AudioTrackSink() {
			@Override
			public void onData(byte[] data, int bitsPerSample, int sampleRate, int channels, int frames) {
				System.out.println(1111);
			}
		});
		RTCRtpTransceiver transceiver = peerConnection.addTransceiver(track, new RTCRtpTransceiverInit());

		assertNotNull(transceiver);

		RTCRtpTransceiver[] transceivers = peerConnection.getTransceivers();

		assertNotNull(transceivers);
		assertEquals(1, transceivers.length);
		assertEquals(transceiver.getSender().getTrack().getId(), transceivers[0].getSender().getTrack().getId());
		assertEquals(RTCRtpTransceiverDirection.SEND_RECV, transceiver.getDirection());
	}


}

Expected behavior A clear and concise description of what you expected to happen.

i can get the video frame

Screenshots If applicable, add screenshots to help explain your problem. image

Desktop (please complete the following information):

  • OS: macos m1
  • Version 0.8.0

Additional context Add any other context about the problem here.

skill7899 avatar Dec 18 '23 02:12 skill7899