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); } }
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; } } } }
/// <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; }