Пример #1
0
        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);
            }
        }
Пример #2
0
        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;
                    }
                }
            }
        }
Пример #3
0
        /// <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;
        }