/// <summary> /// RTP(RFC3550)协议数据包 /// </summary> /// <param name="playloadType">数据报文有效载荷类型</param> /// <param name="sequenceNumber">数据报文序列号值</param> /// <param name="timestamp">数据报文采样时刻</param> /// <param name="frame">图片</param> public RtpPacket(RtpPayloadType playloadType, int sequenceNumber, long timestamp, Image frame) { // fill changing header fields SequenceNumber = sequenceNumber; Timestamp = timestamp; PayloadType = playloadType; // build the header bistream _header = new byte[HeaderSize]; // fill the header array of byte with RTP header fields _header[0] = (byte)((Version << 6) | (Padding << 5) | (Extension << 4) | CC); _header[1] = (byte)((Marker << 7) | (int)PayloadType); _header[2] = (byte)(SequenceNumber >> 8); _header[3] = (byte)(SequenceNumber); for (int i = 0; i < 4; i++) { _header[7 - i] = (byte)(Timestamp >> (8 * i)); } for (int i = 0; i < 4; i++) { _header[11 - i] = (byte)(SSRC >> (8 * i)); } // fill the payload bitstream using (MemoryStream ms = new MemoryStream()) { frame.Save(ms, ImageFormat.Jpeg); _payload = ms.ToArray(); _payloadSize = _payload.Length; } }
internal void MessageReceived(object sender, MessageReceivedEventArgs <RtpPacket> message) { var packet = message.Message; RtpPayloadType ptype = packet.Header.PayloadType; Debug.WriteLine($"Received {ptype}"); switch (ptype) { case RtpPayloadType.Control: OnControlHandshake(packet); break; case RtpPayloadType.ChannelControl: var controlMsg = packet.Payload as Nano.Packets.ChannelControl; _channelManager.HandleChannelControl(controlMsg, packet.Header.ChannelId); break; case RtpPayloadType.Streamer: var streamer = packet.Payload as Nano.Packets.Streamer; _channelManager.HandleStreamer(streamer, packet.Header.ChannelId); break; case RtpPayloadType.UDPHandshake: throw new NotSupportedException($"UDP HandshakeType from server received"); default: throw new NotSupportedException($"Unsupported payload type: {ptype}"); } }
/// <summary> /// RTP(RFC3550)协议数据包 /// </summary> /// <param name="playloadType">数据报文有效载荷类型</param> /// <param name="sequenceNumber">数据报文序列号值</param> /// <param name="timestamp">数据报文采样时刻</param> /// <param name="data">数据</param> /// <param name="dataSize">数据长度</param> public RtpPacket(RtpPayloadType playloadType, int sequenceNumber, long timestamp, byte[] data, int dataSize) { // fill changing header fields SequenceNumber = sequenceNumber; Timestamp = timestamp; PayloadType = playloadType; // build the header bistream _header = new byte[HeaderSize]; // fill the header array of byte with RTP header fields _header[0] = (byte)((Version << 6) | (Padding << 5) | (Extension << 4) | CC); _header[1] = (byte)((Marker << 7) | (int)PayloadType); _header[2] = (byte)(SequenceNumber >> 8); _header[3] = (byte)(SequenceNumber); for (int i = 0; i < 4; i++) { _header[7 - i] = (byte)(Timestamp >> (8 * i)); } for (int i = 0; i < 4; i++) { _header[11 - i] = (byte)(SSRC >> (8 * i)); } // fill the payload bitstream _payload = new byte[dataSize]; _payloadSize = dataSize; // fill payload array of byte from data (given in parameter of the constructor) Array.Copy(data, 0, _payload, 0, dataSize); }
private static ISerializableLE CreateFromPayloadType(RtpPayloadType payloadType) { var type = RtpPayloadTypeAttribute.GetTypeForMessageType(payloadType); if (type == null) { return(null); } return((ISerializableLE)Activator.CreateInstance(type)); }
public void ExtractData(ref NetworkHost sourceHost, NetworkHost destinationHost, IEnumerable <PacketParser.Packets.AbstractPacket> packetList) { Packets.UdpPacket udpPacket = null; foreach (Packets.AbstractPacket p in packetList) { if (p.GetType() == typeof(Packets.UdpPacket)) { udpPacket = (Packets.UdpPacket)p; } else if (udpPacket != null && p.GetType() == typeof(Packets.RtpPacket)) { Packets.RtpPacket rtpPacket = (Packets.RtpPacket)p; if (Enum.IsDefined(typeof(RtpPayloadType), rtpPacket.PayloadType)) { RtpPayloadType payloadType = (RtpPayloadType)rtpPacket.PayloadType; FiveTuple fiveTuple = new FiveTuple(sourceHost, udpPacket.SourcePort, destinationHost, udpPacket.DestinationPort, FiveTuple.TransportProtocol.UDP); AudioStream audioStream; Tuple <System.Net.IPAddress, ushort, System.Net.IPAddress, ushort, RtpPayloadType> key = new Tuple <System.Net.IPAddress, ushort, System.Net.IPAddress, ushort, RtpPayloadType>(sourceHost.IPAddress, udpPacket.SourcePort, destinationHost.IPAddress, udpPacket.DestinationPort, payloadType); if (this.audioStreams.ContainsKey(key)) { audioStream = this.audioStreams[key]; } else { //FileTransfer.FileStreamAssembler assembler = new FileTransfer.FileStreamAssembler(MainPacketHandler.FileStreamAssemblerList, fiveTuple, true, FileTransfer.FileStreamTypes.RTP, "AudioStream-" + fiveTuple.GetHashCode() + ".wav", "/", "RTP " + fiveTuple.ToString(), rtpPacket.ParentFrame.FrameNumber, rtpPacket.ParentFrame.Timestamp); //-1 is set instead of null if Content-Length is not defined //assembler.FileContentLength = -1; //assembler.FileSegmentRemainingBytes = -1; //this.MainPacketHandler.FileStreamAssemblerList.Add(assembler); //audioStream = new AudioStream(sourceHost, destinationHost, wavAudioFormat.Value, MainPacketHandler.FileStreamAssemblerList, fiveTuple, rtpPacket.ParentFrame.FrameNumber); audioStream = new AudioStream(sourceHost, destinationHost, payloadType, MainPacketHandler.FileStreamAssemblerList, fiveTuple, rtpPacket.ParentFrame.FrameNumber); this.audioStreams.Add(key, audioStream); base.MainPacketHandler.OnAudioDetected(audioStream); } audioStream.AddSamples(rtpPacket.ParentFrame.Data.Skip(rtpPacket.PacketStartIndex + Packets.RtpPacket.HEADER_LENGTH).ToArray(), rtpPacket.SampleTick, rtpPacket.ParentFrame.Timestamp, rtpPacket.SyncSourceID); } } } }
public void ExtractData(ref NetworkHost sourceHost, NetworkHost destinationHost, IEnumerable <PacketParser.Packets.AbstractPacket> packetList) { Packets.UdpPacket udpPacket = null; foreach (Packets.AbstractPacket p in packetList) { if (p.GetType() == typeof(Packets.UdpPacket)) { udpPacket = (Packets.UdpPacket)p; } else if (udpPacket != null && p is Packets.RtpPacket rtpPacket) { //Packets.RtpPacket rtpPacket =(Packets.RtpPacket)p; if (Enum.IsDefined(typeof(RtpPayloadType), rtpPacket.PayloadType)) { RtpPayloadType payloadType = (RtpPayloadType)rtpPacket.PayloadType; FiveTuple fiveTuple = new FiveTuple(sourceHost, udpPacket.SourcePort, destinationHost, udpPacket.DestinationPort, FiveTuple.TransportProtocol.UDP); AudioStream audioStream; Tuple <System.Net.IPAddress, ushort, System.Net.IPAddress, ushort, RtpPayloadType> key = new Tuple <System.Net.IPAddress, ushort, System.Net.IPAddress, ushort, RtpPayloadType>(sourceHost.IPAddress, udpPacket.SourcePort, destinationHost.IPAddress, udpPacket.DestinationPort, payloadType); if (this.audioStreams.ContainsKey(key)) { audioStream = this.audioStreams[key]; } else { audioStream = new AudioStream(sourceHost, destinationHost, payloadType, MainPacketHandler.FileStreamAssemblerList, fiveTuple, rtpPacket.ParentFrame.FrameNumber); this.audioStreams.Add(key, audioStream); base.MainPacketHandler.OnAudioDetected(audioStream); } audioStream.AddSamples(rtpPacket.ParentFrame.Data.Skip(rtpPacket.PacketStartIndex + Packets.RtpPacket.HEADER_LENGTH).ToArray(), rtpPacket.SampleTick, rtpPacket.ParentFrame.Timestamp, rtpPacket.SyncSourceID); } } } }
/// <summary> /// 将图片转换成消息 /// </summary> /// <param name="playloadType">数据报文有效载荷类型</param> /// <param name="sequenceNumber">数据报文序列号值</param> /// <param name="timestamp">数据报文采样时刻</param> /// <param name="frame">图片帧</param> /// <returns> /// RTP消息 /// </returns> public static RtpPacket FromImage(RtpPayloadType playloadType, int sequenceNumber, long timestamp, Image frame) { return new RtpPacket(playloadType, sequenceNumber, timestamp, frame); }
public void ExtractData(ref NetworkHost sourceHost, NetworkHost destinationHost, IEnumerable <PacketParser.Packets.AbstractPacket> packetList) { Packets.UdpPacket udpPacket = null; foreach (Packets.AbstractPacket p in packetList) { if (p.GetType() == typeof(Packets.UdpPacket)) { udpPacket = (Packets.UdpPacket)p; } else if (udpPacket != null && p.GetType() == typeof(Packets.RtpPacket)) { Packets.RtpPacket rtpPacket = (Packets.RtpPacket)p; if (Enum.IsDefined(typeof(RtpPayloadType), rtpPacket.PayloadType)) { RtpPayloadType payloadType = (RtpPayloadType)rtpPacket.PayloadType; FiveTuple fiveTuple = new FiveTuple(sourceHost, udpPacket.SourcePort, destinationHost, udpPacket.DestinationPort, FiveTuple.TransportProtocol.UDP); //if(rtpPacket.PayloadType == (byte)RtpPayloadTypes.G711_PCM_A) { /* * FileTransfer.AuFileAssembler auAssembler = null; * if (this.MainPacketHandler.FileStreamAssemblerList.ContainsAssembler(fiveTuple, true, true)) { * var assembler = this.MainPacketHandler.FileStreamAssemblerList.GetAssembler(fiveTuple, true); * if (assembler is FileTransfer.AuFileAssembler) { * auAssembler = (FileTransfer.AuFileAssembler)assembler; * if (auAssembler.AuEncoding == FileTransfer.AuFileAssembler.Encoding.G711_ALAW && payloadType == RtpPayloadType.G711_PCM_A || * auAssembler.AuEncoding == FileTransfer.AuFileAssembler.Encoding.G711_ULAW && payloadType == RtpPayloadType.G711_PCM_U || * auAssembler.AuEncoding == FileTransfer.AuFileAssembler.Encoding.G722 && payloadType == RtpPayloadType.G722) { * //do nothing we have already assigned the auAssembler variable * } * else * auAssembler = null; * } * } * else if (payloadType == RtpPayloadType.G711_PCM_A) { * auAssembler = new FileTransfer.AuFileAssembler("RTP-stream-" + fiveTuple.GetHashCode().ToString() + "_" + payloadType.ToString() + ".au", this.MainPacketHandler.FileStreamAssemblerList, fiveTuple, FileTransfer.FileStreamTypes.RTP, rtpPacket.ParentFrame.FrameNumber, rtpPacket.ParentFrame.Timestamp, FileTransfer.AuFileAssembler.Encoding.G711_ALAW); * auAssembler.TryActivate(); * } * else if (payloadType == RtpPayloadType.G711_PCM_U) { * auAssembler = new FileTransfer.AuFileAssembler("RTP-stream-" + fiveTuple.GetHashCode().ToString() + "_" + payloadType.ToString() + ".au", this.MainPacketHandler.FileStreamAssemblerList, fiveTuple, FileTransfer.FileStreamTypes.RTP, rtpPacket.ParentFrame.FrameNumber, rtpPacket.ParentFrame.Timestamp, FileTransfer.AuFileAssembler.Encoding.G711_ULAW); * auAssembler.TryActivate(); * } * else if (payloadType == RtpPayloadType.G722) { * auAssembler = new FileTransfer.AuFileAssembler("RTP-stream-" + fiveTuple.GetHashCode().ToString() + "_" + payloadType.ToString() + ".au", this.MainPacketHandler.FileStreamAssemblerList, fiveTuple, FileTransfer.FileStreamTypes.RTP, rtpPacket.ParentFrame.FrameNumber, rtpPacket.ParentFrame.Timestamp, FileTransfer.AuFileAssembler.Encoding.G722); * auAssembler.TryActivate(); * } * * if(auAssembler != null) { * auAssembler.AddData(rtpPacket.ParentFrame.Data.Skip(rtpPacket.PacketStartIndex + Packets.RtpPacket.HEADER_LENGTH).ToArray(), rtpPacket.SequenceNumber); * } */ /* * AudioStream.AudioFormat? wavAudioFormat = null; * if (payloadType == RtpPayloadType.G711_PCM_A) * wavAudioFormat = AudioStream.AudioFormat.WAVE_FORMAT_ALAW; * else if (payloadType == RtpPayloadType.G711_PCM_U) * wavAudioFormat = AudioStream.AudioFormat.WAVE_FORMAT_MULAW; * else if (payloadType == RtpPayloadType.G729) * wavAudioFormat = AudioStream.AudioFormat.WAVE_FORMAT_G729; * * if (wavAudioFormat != null) { */ AudioStream audioStream; Tuple <System.Net.IPAddress, ushort, System.Net.IPAddress, ushort, RtpPayloadType> key = new Tuple <System.Net.IPAddress, ushort, System.Net.IPAddress, ushort, RtpPayloadType>(sourceHost.IPAddress, udpPacket.SourcePort, destinationHost.IPAddress, udpPacket.DestinationPort, payloadType); if (this.audioStreams.ContainsKey(key)) { audioStream = this.audioStreams[key]; } else { //FileTransfer.FileStreamAssembler assembler = new FileTransfer.FileStreamAssembler(MainPacketHandler.FileStreamAssemblerList, fiveTuple, true, FileTransfer.FileStreamTypes.RTP, "AudioStream-" + fiveTuple.GetHashCode() + ".wav", "/", "RTP " + fiveTuple.ToString(), rtpPacket.ParentFrame.FrameNumber, rtpPacket.ParentFrame.Timestamp); //-1 is set instead of null if Content-Length is not defined //assembler.FileContentLength = -1; //assembler.FileSegmentRemainingBytes = -1; //this.MainPacketHandler.FileStreamAssemblerList.Add(assembler); //audioStream = new AudioStream(sourceHost, destinationHost, wavAudioFormat.Value, MainPacketHandler.FileStreamAssemblerList, fiveTuple, rtpPacket.ParentFrame.FrameNumber); audioStream = new AudioStream(sourceHost, destinationHost, payloadType, MainPacketHandler.FileStreamAssemblerList, fiveTuple, rtpPacket.ParentFrame.FrameNumber); this.audioStreams.Add(key, audioStream); base.MainPacketHandler.OnAudioDetected(audioStream); } audioStream.AddSamples(rtpPacket.ParentFrame.Data.Skip(rtpPacket.PacketStartIndex + Packets.RtpPacket.HEADER_LENGTH).ToArray(), rtpPacket.SampleTick, rtpPacket.ParentFrame.Timestamp, rtpPacket.SyncSourceID); //} } } } }
public RtpPayloadTypeAttribute(RtpPayloadType messageType) { MessageType = messageType; }
public static Type GetTypeForMessageType(RtpPayloadType messageType) { return(_typeMapping.GetTypeForKey(messageType)); }
public RtpPacket(RtpPayloadType payloadType) { Header = new RtpHeader(); Header.PayloadType = payloadType; }
public RtpPacket(RtpPayloadType payloadType, ISerializableLE payload) { Header = new RtpHeader(); Header.PayloadType = payloadType; Payload = payload; }
/// <summary> /// 将图片转换成消息 /// </summary> /// <param name="playloadType">数据报文有效载荷类型</param> /// <param name="sequenceNumber">数据报文序列号值</param> /// <param name="timestamp">数据报文采样时刻</param> /// <param name="frame">图片帧</param> /// <returns> /// RTP消息 /// </returns> public static RtpPacket FromImage(RtpPayloadType playloadType, int sequenceNumber, long timestamp, Image frame) { return(new RtpPacket(playloadType, sequenceNumber, timestamp, frame)); }