[FFMPEG-代码分析]rtsp客户端

1.代码

libavformat/rtspdec.c 
libavformat/rtsp.c 

2.说明

RTSP具有独立于传输的特性,它本身并不传输流,只是做一个“网络遥控”的作用。在FFMPEG中认为RTSP是一种封装格式,而不是一种协议。

3.RTSP和HTTP的区别

  • RTSP引入了很多新方法并且有不同的协议标识符。
  • RTSP服务器在绝大多数默认情况下需要维持状态,而HTTP是无状态协议
  • RTSP客户机和服务器都可以发出请求,而HTTP只能由客户端发起请求
  • 数据由信带外的另一个协议传送(TCP,UDP,HTTP等)
  • RTSP使用IS 10646(UTF-8) 而不是IS 8859-1,以配合当前HTML的国际化。
  • RTSP的URI包含绝对URI,而HTTP/1.0请求包含的是相对路径,HTTP/1.1请求包含绝对路径,把主机名放入单独的头部域中。

3.代码分析

rtsp_probe:主要是实现对rtsp或rtsps的格式探测;
rtsp_read_header:主要是实现建立以及完成部分(OPTIONS,DESCRIBE,SETUP,PLAY)会话;
ff_rtsp_connect(以负载使用UDP协议):
    1.打开RTSP的会话TCP连接;
    2.OPTIONS会话
    3.DESCRIBE会话:并解析SDP文件(ff_sdp_parse)
    4.SETUP会话:设置默认超时为1分钟,计算本地端口,创建RTP/RTCP连接,发送SETUP请求
    5.初始化RTSP的状态为RTSP_STATE_IDLE(空闲);
 rtsp_read_play 
    1.发送punch包:分别通过RTP和RTCP连接发送各自的头版本信息 
    2.PLAY会话
    3.设置RTSP的状态为RTSP_STATE_STREAMING
    当负载使用UDP协议时,端口机制为使用默认范围500065000之间的一对随机数;
    当回复的status_code大于400时,认为失败
    默认使用的RTSP版本为1.0
rtsp_read_packet:主要是实现包数据的读取;
    1.读包数据:将RTP和RTCP加入poll,先尝试RTCP,再读RTP
    2.发送心跳:若支持GET_PARAMETER,则优先使用;否则使用OPTIONS作为心跳包;默认心跳超时为30秒
rtsp_read_close:主要是实现关闭会话;
    1.TEARDOWN会话
rtsp_read_seek:主要是实现seek跳转功能;
    1.RTSP状态机机制(IDLE->STREAMING->[SEEKING]->STREAMING)
    2.当RTSP状态机为STREAMING,先发送PAUSE命令,然后将seek的时间设置到PLAY的“Range: npt=”字段,然后发送PLAY命令
    3.当RTSP状态机为PAUSED时,将状态设置为IDLE
rtsp_read_play:主要是实现流播放会话;
    1.当RTSP状态机为PAUSED时,直接发送PLAY指令,不需要“Range: npt=”字段,否则发送带“Range: npt=”字段的指令;
rtsp_read_pause:主要是实现流暂停会话;
    1.PAUSE会话

4.RTCP

RTCP和 RTP一起工作的控制协议,主要功能是为应用程序提供会话质量或者广播性能质量的信息。

发布了91 篇原创文章 · 获赞 28 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/weixin_35804181/article/details/73927647