예제 #1
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;
                    }
                }
            }
        }
예제 #2
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);
            }
        }
예제 #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);
        }
예제 #4
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;
        }
예제 #5
0
        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();
        }