private static void TransportParse(ref RTSPResponse response, string transportString) { string[] paramSplits=transportString.Split(';'); foreach(string param in paramSplits) { string[] valueSplits = param.Split('='); if (valueSplits.Length == 2) { string name = valueSplits[0]; string value = valueSplits[1]; switch (name) { case "client_port": //... break; case "server_port": //... break; case "ssrc": response.SSRT = uint.Parse(value, System.Globalization.NumberStyles.HexNumber); break; } } } }
private static void RTPInfoParse(ref RTSPResponse response, string RTPInfoString) { string[] trackSplits = RTPInfoString.Replace(" ",string.Empty).Split(','); foreach (string track in trackSplits) { RtpTrackInfo rtspTrack = new RtpTrackInfo(); string[] paramSplits = track.Split(';'); foreach (string param in paramSplits) { string[] valueSplits = param.Split('='); if (valueSplits.Length > 1) { string name = valueSplits[0]; string value = valueSplits[1]; switch (name) { case "url": if(valueSplits.Length==2) { rtspTrack.URL=value; } else if (valueSplits.Length==3) { rtspTrack.URL=String.Format("{0}={1}",value,valueSplits[2] ); } break; case "seq": rtspTrack.Seq = uint.Parse(value, System.Globalization.NumberStyles.Integer); //... break; case "rtptime": rtspTrack.RTPTime = uint.Parse(value, System.Globalization.NumberStyles.Integer); //... break; } } } response.RtpTracks.Add(rtspTrack); } }
/// <summary> /// Создает объект RTSPResponse из строки /// </summary> /// <param name="str">Текст в формате RTSP</param> /// <returns>Объект типа RTSPResponse</returns> private static RTSPResponse Parse(string str) { RTSPResponse response = new RTSPResponse(); // разделяем RTSP ответ на голову и тело string[] headAndBody = str.Split(new string[] { "\r\n\r\n" }, StringSplitOptions.None); string head = headAndBody[0]; // если в ответе есть тело, то получаем его response.Body = headAndBody.Length > 1 ? headAndBody[1] : null; // разделяем голову на заголовки string[] headers = head.Split(new string[] { Environment.NewLine }, StringSplitOptions.None); { // извлекаем статус string[] parts = headers[0].Split(' '); response.StatusCode = int.Parse(parts[1]); string status = parts[2]; for (int i = 3; i < parts.Length; i++) { status += " " + parts[i]; } response.Status = status; } for (int i = 1; i < headers.Length; i++) { // положение двоеточия в заколовке int colonIndex = headers[i].IndexOf(':'); // имя заголовка string headerName = headers[i].Substring(0, colonIndex); // длина значения заголовка int headerValueLength = headers[i].Length - colonIndex - 1; // значение заголовка string headerValue = headers[i].Substring(colonIndex + 1, headerValueLength).Trim(); // заполняем все заголовки switch (headerName) { case "CSeq": response.CSeq = int.Parse(headerValue); break; case "Connection": response.Connection = headerValue; break; case "Content-Base": response.ContentBase = headerValue; break; case "Content-Type": response.ContentType = headerValue; break; case "Content-Length": response.ContentLength = int.Parse(headerValue); break; case "Public": response.Public = headerValue.Split(new string[] { ", " }, StringSplitOptions.None); break; case "Session": response.Session = headerValue; break; case "Transport": response.Transport = headerValue; TransportParse(ref response, headerValue); break; case "RTP-Info": response.RTPInfo = headerValue; RTPInfoParse(ref response, headerValue); break; } } return(response); }
/// <summary> /// Создает объект RTSPResponse из строки /// </summary> /// <param name="str">Текст в формате RTSP</param> /// <returns>Объект типа RTSPResponse</returns> private static RTSPResponse Parse(string str) { RTSPResponse response = new RTSPResponse(); // разделяем RTSP ответ на голову и тело string[] headAndBody = str.Split(new string[] { "\r\n\r\n" }, StringSplitOptions.None); string head = headAndBody[0]; // если в ответе есть тело, то получаем его response.Body = headAndBody.Length > 1 ? headAndBody[1] : null; // разделяем голову на заголовки string[] headers = head.Split(new string[] { Environment.NewLine }, StringSplitOptions.None); { // извлекаем статус string[] parts = headers[0].Split(' '); response.StatusCode = int.Parse(parts[1]); string status = parts[2]; for (int i = 3; i < parts.Length; i++) status += " " + parts[i]; response.Status = status; } for (int i = 1; i < headers.Length; i++) { // положение двоеточия в заколовке int colonIndex = headers[i].IndexOf(':'); // имя заголовка string headerName = headers[i].Substring(0, colonIndex); // длина значения заголовка int headerValueLength = headers[i].Length - colonIndex - 1; // значение заголовка string headerValue = headers[i].Substring(colonIndex + 1, headerValueLength).Trim(); // заполняем все заголовки switch (headerName) { case "CSeq": response.CSeq = int.Parse(headerValue); break; case "Connection": response.Connection = headerValue; break; case "Content-Base": response.ContentBase = headerValue; break; case "Content-Type": response.ContentType = headerValue; break; case "Content-Length": response.ContentLength = int.Parse(headerValue); break; case "Public": response.Public = headerValue.Split(new string[] { ", " }, StringSplitOptions.None); break; case "Session": response.Session = headerValue; break; case "Transport": response.Transport = headerValue; TransportParse(ref response, headerValue); break; case "RTP-Info": response.RTPInfo = headerValue; RTPInfoParse(ref response, headerValue); break; } } return response; }
public void Start() { RTSPChannelParameters videoParameters = new RTSPChannelParameters { }; RTSPChannelParameters audioParameters = new RTSPChannelParameters { }; rtspSession = RTSPSession.Open(this.MediaDevice.ONVIF.GetCurrentMediaProfileRtspStreamUri().AbsoluteUri); //rtspSession.RTSPServerResponse += new RTSPSession.RTSPResponseHandler(rtsp_RTSPServerResponse); // OPTIONS возвращает команды сервера // OPTIONS, DESCRIBE, SETUP, PLAY, PAUSE, GET_PARAMETER, TEARDOWN, SET_PARAMETER RTSPResponse respons = rtspSession.Options(); // DESCRIBE возвращает SDP файл respons = rtspSession.Describe(); string ContentBase = respons.ContentBase; // Парсим SDP пакет sdp = SDP.Parse(respons.Body); videoParameters.Codec = sdp.GetCodec(MediaType: "video"); videoParameters.SampleRate = sdp.GetSampleRate(MediaType: "video"); string VideoControl = sdp.GetControl(MediaType: "video"); audioParameters.Codec = sdp.GetCodec(MediaType: "audio"); audioParameters.SampleRate = sdp.GetSampleRate(MediaType: "audio"); string AudioControl = sdp.GetControl(MediaType: "audio"); string VideoSetupUri = String.Format("{0}{1}", ContentBase, VideoControl); string AudioSetupUri = String.Format("{0}{1}", ContentBase, AudioControl); int[] ports = GetPortRange(4); videoParameters.RTPPort = ports[0]; videoParameters.RTCPPort = ports[1]; audioParameters.RTPPort = ports[2]; audioParameters.RTCPPort = ports[3]; respons = rtspSession.Setup(VideoSetupUri, videoParameters.RTPPort, videoParameters.RTCPPort); rtspSession.Parameters.Session = respons.Session; videoParameters.SSRT = respons.SSRT; respons = rtspSession.Setup(AudioSetupUri, audioParameters.RTPPort, audioParameters.RTCPPort, rtspSession.Parameters.Session); audioParameters.SSRT = respons.SSRT; respons = rtspSession.Play(rtspSession.Parameters.Session); videoChannel = new RTSPChannel(videoParameters); audioChannel = new RTSPChannel(audioParameters); //audioChannel.DataRecieved += MediaDevice.AVProcessor.AudioDataRecieved; //videoChannel.DataRecieved += MediaDevice.AVProcessor.VideoDataRecieved; audioChannel.DataRecieved += MediaDevice.Decoder.AudioDataRecieved; videoChannel.DataRecieved += MediaDevice.Decoder.VideoDataRecieved; videoChannel.StartRecieving(); audioChannel.StartRecieving(); }