[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请求包含绝对路径,把主机名放入单独的头部域中。

4.代码分析

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协议时,端口机制为使用默认范围5000~65000之间的一对随机数;
    当回复的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会话

5.RTCP

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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酷咪哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值