一、 rtsp 协议说明
rtsp的协议层级
- rtsp 属于应用层, 使用tcp传输,主要是传递服务器的一些信息,实现流连接。播放 暂停 销毁等控制
- rtp 实现音视频数据包的发送,通过RTSP等协议的SDP信息协商好了RTP数据包的发送目的和传输方式,我们就需要把音视频数据打包成RTP包,用UDP或者tcp发送给接收端了。
二、ffmpeg 中的实现
1. rtsp_read_header
其中ff_rtsp_connect连接服务器, 首先会指定下一层使用的协议是什么? 可以指定rtp over tcp 或者 rtp over udp。由这个lower_transport_mask 决定的,rt->lower_transport_mask 会有一个默认值。 通过ff_rtsp_options[] 进行设置的
{ "rtsp_transport", "RTSP transport protocols", OFFSET(lower_transport_mask), AV_OPT_TYPE_FLAGS, {.i64 = 0}, INT_MIN, INT_MAX, DEC|ENC, "rtsp_transport" }, \
默认是0 udp的形式。
2. ffurl_open
ffurl_open(&rt->rtsp_hd, tcpname, AVIO_FLAG_READ_WRITE,&s->interrupt_callback, NULL) < 0)
- 调用到了tcp_open(), tcp去连接,tcp调用 socket() 创建tcp的fd。