/// <summary> /// Send a PLAY request to the RTSP server to commence the media stream. /// </summary> public void Play() { ThreadPool.QueueUserWorkItem(delegate { ProcessRTPPackets(); }); ThreadPool.QueueUserWorkItem(delegate { SendKeepAlives(); }); RTSPRequest playRequest = new RTSPRequest(RTSPMethodsEnum.PLAY, _url); RTSPHeader playHeader = new RTSPHeader(_cseq++, _rtspSession.SessionID); playRequest.Header = playHeader; Debug.WriteLine(playRequest.ToString()); var rtspRequestBuffer = Encoding.UTF8.GetBytes(playRequest.ToString()); _rtspStream.Write(rtspRequestBuffer, 0, rtspRequestBuffer.Length); var buffer = new byte[2048]; var bytesRead = _rtspStream.Read(buffer, 0, 2048); if (bytesRead > 0) { Debug.WriteLine(Encoding.UTF8.GetString(buffer, 0, bytesRead)); var rtspMessage = RTSPMessage.ParseRTSPMessage(buffer, null, null); if (rtspMessage.RTSPMessageType == RTSPMessageTypesEnum.Response) { var playResponse = RTSPResponse.ParseRTSPResponse(rtspMessage); Logger.Logger.Debug("RTSP Response received to PLAY: " + playResponse.StatusCode + " " + playResponse.Status + " " + playResponse.ReasonPhrase + "."); } } else { throw new ApplicationException( "Zero bytes were read from the RTSP client socket in response to a PLAY request."); } }
public void Start(string url) { _url = url; Match urlMatch = Regex.Match(url, @"rtsp://(?<hostname>\S+?)/", RegexOptions.IgnoreCase); if (!urlMatch.Success) { throw new ApplicationException("The URL provided to the RTSP client was not recognised, " + url + "."); } else { string hostname = urlMatch.Result("${hostname}"); int port = RTSP_PORT; if (hostname.Contains(':')) { port = IPSocket.ParsePortFromSocket(hostname); hostname = IPSocket.ParseHostFromSocket(hostname); } logger.Debug("RTSP client connecting to " + hostname + ", port " + port + "."); _rtspConnection = new TcpClient(hostname, port); _rtspStream = _rtspConnection.GetStream(); _rtspSession = new RTSPSession(); _rtspSession.RTPPayloadHeaderLength = _rtpPayloadHeaderLength; _rtspSession.ReservePorts(); _rtspSession.OnRTPQueueFull += RTPQueueFull; RTSPRequest rtspRequest = new RTSPRequest(RTSPMethodsEnum.SETUP, url); RTSPHeader rtspHeader = new RTSPHeader(_cseq++, null); rtspHeader.Transport = new RTSPTransportHeader() { ClientRTPPortRange = _rtspSession.RTPPort + "-" + _rtspSession.ControlPort }; rtspRequest.Header = rtspHeader; string rtspReqStr = rtspRequest.ToString(); RTSPMessage rtspMessage = null; Debug.WriteLine(rtspReqStr); byte[] rtspRequestBuffer = Encoding.UTF8.GetBytes(rtspReqStr); _rtspStream.Write(rtspRequestBuffer, 0, rtspRequestBuffer.Length); byte[] buffer = new byte[2048]; int bytesRead = _rtspStream.Read(buffer, 0, 2048); if (bytesRead > 0) { Debug.WriteLine(Encoding.UTF8.GetString(buffer, 0, bytesRead)); rtspMessage = RTSPMessage.ParseRTSPMessage(buffer, null, null); if (rtspMessage.RTSPMessageType == RTSPMessageTypesEnum.Response) { var setupResponse = RTSPResponse.ParseRTSPResponse(rtspMessage); if (setupResponse.Status == RTSPResponseStatusCodesEnum.OK) { _rtspSession.SessionID = setupResponse.Header.Session; _rtspSession.RemoteEndPoint = new IPEndPoint( (_rtspConnection.Client.RemoteEndPoint as IPEndPoint).Address, setupResponse.Header.Transport.GetServerRTPPort()); _rtspSession.Start(); logger.Debug("RTSP Response received to SETUP: " + setupResponse.Status + ", session ID " + _rtspSession.SessionID + ", server RTP endpoint " + _rtspSession.RemoteEndPoint + "."); if (OnSetupSuccess != null) { OnSetupSuccess(this); } } else { logger.Warn("RTSP Response received to SETUP: " + setupResponse.Status + "."); throw new ApplicationException("An error response of " + setupResponse.Status + " was received for an RTSP setup request."); } } } else { throw new ApplicationException( "Zero bytes were read from the RTSP client socket in response to a SETUP request."); } } }