public async Task <ApiResult> Broadcast() { var roomId = "0"; var deviceId = "100001@100001"; var videoSsrc = 2222u; var audioSsrc = videoSsrc + 2; await _scheduler.LeaveAsync(deviceId); var joinRequest = new JoinRequest { RtpCapabilities = new RtpCapabilities(), DisplayName = $"Device:{deviceId}", Sources = new[] { "video:cam", "audio:mic" }, AppData = new Dictionary <string, object> { ["type"] = "Device" }, }; _ = await _scheduler.JoinAsync(deviceId, "", joinRequest); var joinRoomRequest = new JoinRoomRequest { RoomId = roomId, }; _ = await _scheduler.JoinRoomAsync(deviceId, "", joinRoomRequest); var createPlainTransportRequest = new CreatePlainTransportRequest { Comedia = true, RtcpMux = false, Producing = true, Consuming = false, }; var transport = await _scheduler.CreatePlainTransportAsync(deviceId, "", createPlainTransportRequest); // Audio: "{ \"codecs\": [{ \"mimeType\":\"audio/opus\", \"payloadType\":${AUDIO_PT}, \"clockRate\":48000, \"channels\":2, \"parameters\":{ \"sprop-stereo\":1 } }], \"encodings\": [{ \"ssrc\":${AUDIO_SSRC} }] }" // Video :"{ \"codecs\": [{ \"mimeType\":\"video/vp8\", \"payloadType\":${VIDEO_PT}, \"clockRate\":90000 }], \"encodings\": [{ \"ssrc\":${VIDEO_SSRC} }] }" var videoProduceRequest = new ProduceRequest { Kind = MediaKind.Video, Source = "video", RtpParameters = new RtpParameters { Codecs = new List <RtpCodecParameters> { new RtpCodecParameters { MimeType = "video/h264", PayloadType = 98, ClockRate = 90000, } }, Encodings = new List <RtpEncodingParameters> { new RtpEncodingParameters { Ssrc = videoSsrc } }, }, AppData = new Dictionary <string, object> { ["peerId"] = deviceId, } }; var videoProduceResult = await _scheduler.ProduceAsync(deviceId, "", videoProduceRequest); var audioProduceRequest = new ProduceRequest { Kind = MediaKind.Audio, Source = "audio", RtpParameters = new RtpParameters { Codecs = new List <RtpCodecParameters> { new RtpCodecParameters { MimeType = "audio/PCMA", PayloadType = 8, ClockRate = 8000, } }, Encodings = new List <RtpEncodingParameters> { new RtpEncodingParameters { Ssrc = audioSsrc } }, }, AppData = new Dictionary <string, object> { ["peerId"] = deviceId, } }; var audioProduceResult = await _scheduler.ProduceAsync(deviceId, "", audioProduceRequest); var result = new CreatePlainTransportResult { TransportId = transport.TransportId, Ip = transport.Tuple.LocalIp, Port = transport.Tuple.LocalPort, }; return(new ApiResult <CreatePlainTransportResult> { Data = result }); }
public async Task <PlainTransport> CreatePlainTransportAsync(string peerId, string connectionId, CreatePlainTransportRequest createPlainTransportRequest) { using (await _peersLock.ReadLockAsync()) { if (!_peers.TryGetValue(peerId, out var peer)) { throw new PeerNotExistsException("CreateWebRtcTransport()", peerId); } CheckConnection(peer, connectionId); return(await peer.CreatePlainTransportAsync(createPlainTransportRequest)); } }