首页 > 编程知识 正文

rstp协议端口状态,rtsp交互失败怎么办

时间:2023-05-05 14:39:37 阅读:9869 作者:442

参考资料地址

是RTSP、实时流媒体协议、TCP/UDP协议体系中的APP应用层协议,是哥伦比亚大学、网景和实时网络公司提出的IETF RFC标准。 该协议定义了一对多APP应用如何有效地通过IP网络传输多媒体数据。 RTSP位于RTP和RTCP之上的体系结构中,使用TCP或RTP完成数据传输。

流媒体服务协议栈

rsp提供了一个可扩展的框架,允许实时数据,如音频和视频的受控按需。 数据源包含动态数据和存储在剪辑中的数据。 该协议的目的是控制多个数据传输链路,Wie选择传输信道。 提供了与UDP多播UDP和TCP一样的路由,并提供了用于选择基于RTP的发送机制的方法。

其语法和动作与HTTP 1.1相似,但并不特别强调时间同步,使得网络延迟是可以接受的。

与RTSP相比,HTTP发送HTTP。 HTTP请求由客户端发出,服务器响应的* RTSP发送多媒体数据。 使用RTSP,客户端和服务器都可以发出请求。 即,RTSP可以是双向的。

RTSP是一种用于控制音频或视频的多媒体流媒体协议,可以同时控制多个流媒体需求。 用于传输的网络通信协议不在定义范围内,服务器段可以选择自动使用TCP或UDP传输流内容。

此外,通过启用上述同时多个流的请求控制,不仅可以减少服务器端的网络使用量,还可以支持多个视频会议。 由于与HTTP 1.1相同,因此代理服务器的快速选择功能也适用于RTSP,并且RTSP具有重定向功能,因此可以根据实际负载情况切换提供服务的服务器,防止过大的负载集中在同一服务器上而延迟

此协议用于CS模型中,是一种基于文本的协议,用于在客户端和服务器端段建立和协商实时流会话。

实时流协议建立和控制一个或多个时间同步的连续流媒体,尽管可以在连续的媒体流和控制流之间交换。 本省通常不发送连续流。 这意味着RTSP用作多媒体服务器的网络远程控制,而RTSP链路未绑定到传输层链路(如TCP )。 在RTSP连接期间,RTSP用户可以打开或关闭多个服务器的可传输连接。 另外,RTP可以使用UDP这样没有连接的传输协议,但RTSP的动作依赖于传送连续介质的传输机制.

具体的实施步骤如下

)目的是让客户端启动RTSP OPTION请求,并了解服务器提供什么样的方法。 rsp提供的方法一般包括OPTIONS、DESCRIBE、SETUP、TEARDOWN、PLAY、PAUSE、SCALE和GET_PARAMETER。

)2)服务器响应RTSP选项,服务器实现哪些方法以及响应哪些方法。 在此系统中,我们仅实现了DESCRIBE、SETUP、TEARDOWN、PLAY和PAUSE方法。

)3)客户端发起RTSP DESCRIBE请求,服务器接受的信息主要有媒体名称、解码类型、视频分辨率等描述,目的是从服务器获得会话描述信息(SDP )。

)4)服务器响应RTSP DESCRIBE,发送所需的媒体参数。 传输H.264文件时,主要包含SPS/PPS、媒体名称、传输协议等信息。

(5)客户端发起RTSP设置请求,请求建立会话和准备转移。 请求信息主要包括传输协议和客户端端口号。

(6)服务器响应RTSP SETUP,发布相应服务器端的端口号和会话标识符。

)7)客户端提出RTSP PLAY请求以请求播放视频流。

(8)服务器响应于RTSP PLAY,并且应答消息包括会话标识符、RTP分组的序号、时间戳。 此时,服务器将传输H264视频流软件包。

(9)客户端发出RTSP TEARDOWN请求,目的是关闭连接并结束传输。

(10 )服务器关闭连接,停止传输。

3. SETUP请求消息处理过程

RTSPClientSession类用于处理单个客户会话。 其类成员函数handleCmd_SETUP ()处理客户端的SETUP请求。 调用parseTransportHeader ()对SETUP请求进行传输标头分析(子会话) (其中具体实现类为OnDemandServerMediaSubsession ) )的getstreamparaader 将这些参数组合成响应消息并返回给客户端。

获取传输参数的过程:调用实现mpeg1or2 demuxedservermediasubsession类的子会话的createNewStreamSource .以获取mpeg1or2 videostreamframement 这些调用子会话的信息还存储在StreamState类对象中,用于记录流的状态。

客户端发送两个SETUP请求,分别用于建立音频和视频的RTP接收。

4 .播放请求消息处理过程

RTSPClientSession类成员函数handleCmd_PLAY ()处理客户端的播放请求。 首先调用子会话

startStream(),内部调用MediaSink::startPlaying(...),然后是MultiFramedRTPSink::continuePlaying(),接着调用MultiFramedRTPSink::buildAndSendPacket(...)。buildAndSendPacke内部先设置RTP包头,内部再调用MultiFramedRTPSink::packFrame()填充编码帧数据。

packFrame内部通过FramedSource::getNextFrame(), 接着MPEGVideoStreamFramer::doGetNextFrame(),再接着经过MPEGVideoStreamFramer::continueReadProcessing(), FramedSource::afterGetting(...), MultiFramedRTPSink::afterGettingFrame(...), MultiFramedRTPSink::afterGettingFrame1(...)等一系列繁琐调用,最后到了MultiFramedRTPSink::sendPacketIfNecessary(), 这里才真正发送RTP数据包。然后是计算下一个数据包发送时间,把MultiFramedRTPSink::sendNext(...)函数句柄传给任务调度器,作为一个延时事件调度。在主循环中,当MultiFramedRTPSink::sendNext()被调度时,又开始调用MultiFramedRTPSink::buildAndSendPacket(...)开始新的发送数据过程,这样客户端可以源源不断的收到服务器传来的RTP包了。

发送RTP数据包的间隔计算方法:

Update the time at which the next packet should be sent, based on the duration of the frame that we just packed into it.

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。