FFmpeg 4.3 音视频-多路H265监控录放C++开发二十一.4,SDP协议分析
SDP在4566 中有详细描述。
SDP 全称是 Session Description Protocol,
翻译过来就是描述会话的协议。
主要用于两个会话实体之间的媒体协商。
什么叫会话呢,比如一次网络电话、一次电话会议、一次视频聊天,这些都可以称之为一次会话。
那为什么要去发这个描述文本呢,主要是为了解决参与会话的各成员之间能力不对等的问题,如果参加本次通话的成员都支持高质量的通话,但是我们没有去进行协议,为了兼容性,使用的都是普通质量的通话格式,这样就很浪费资源了。所以 SDP 的作用还是很有必要的。
SDP 协议结构 key = value
key 一般是一个字母,
value 的值由key的啥 对应不同的值
协议中的特殊符号 *
由两大部分组成 或者三大部分组成,原始协议中将会话时间和重复信息划分到 (time description中)
协议部分说明是三大部分
会话级别信息
协议版本号(v)(必选)
version的缩写
作用:⼀个会话描述的开始,前⼀个会话结束标志。
描述: 表示sdp的版本号,不包含次版本号
会话源(o)(必选)
origin的缩写
作用:(会话源或者会话⽣成者,以及会话标识符)
会话名称(s)(必选)
Session Name 的缩写
(会话名称)这个字段是个⽂本字符串,可以显示给会话参与者。
s=SDP Seminar
s=No Name
时间描述(t)(必选)
- 描述:t字段描述了会话的开始时间和结束时间, 为 NTP时间,单位是秒;如果 为0表示过了之后,会话一直持续;当 和 都为0的时候,表示持久会话,如拉实时流;
属性(a)(可选)一般都会有值
会话信息(i)(可选)
例子
URI(u)(可选)
u=http://www.example.com/seminars/sdp.pdf
E-mail地址(e)(可选)
电话号码(p)(可选)
连接信息(c)(可选)
Connection Data
- network type:网络类型,一般为IN,表示internet;
- address type:地址类型,一般为IP4;
- connection address,地址,可能为域名或ip地址两种形式;
带宽信息(b)(可选)
- 描述:该选项描述了建议的带宽,单位 kbs/s,可选,modifier包括两种类型,CT和AS,CT表示总带宽,AS表示单个媒体带宽的最大值;bandwidth表示具体的带宽;
重复信息(r)(可选)
活动持续时间
与开始时间的偏移
时区调整(z)(可选)
加密密钥(k)(可选)
媒体级别信息
媒体描述(m)
表示一个会话的媒体信息;
格式: m=(媒体类型)(端⼝号码)(传送层协议)(格式列表)
media:媒体类型。有"audio",“video”,“application”,“data”(不向用户显示的数据),“control”(描述额外的控制通道);
port:表示媒体流发往传输层的端口,对于RTP,偶数端口用来传输数据,奇数端口对应RTCP用来传输信令;
transport type:表示传输协议,与"c="一行相关联,一般用RTP/AVP表示,即 Realtime Transport Protocol using the Audio/Video profile over udp,即我们常说的RTP over udp;
fmt list:表示媒体格式,分为静态绑定和动态绑定;
静态绑定:媒体编码方式与RTP负载类型有确定的一一对应关系,如: m=audio 0 RTP/AVP 8;
动态绑定:媒体编码方式没有完全确定,需要使用rtpmap进行进一步的说明;如下例子
m=video 0 RTP/AVP 96
a=rtpmap:96 H264/90000
媒体信息(i)(可选)
连接信息(c)(会话级进⾏了规定,这⾥可选)
带宽信息(b)(可选)
加密密钥(k)(可选)
属性(a)(可选,但是一般都要填充)
属性有两种形式,第⼀种是特征属性,第⼆种属于值属性。SDP描述了多个建议属性。
特征属性:
例如a=sendonly 表明会话描述的发送者只希望发送数据⽽不打算接收数据,端⼝号⽆意义,可以置为0。
值属性:
a=rtpmap在协议中,SIP建议尽量使用该属性,因此要特别分析一下,
参见上面的分析
a=fmtp
fmtp(format parameters)用于指定媒体数据格式。
格式:a=fmtp:<format> <format specific parameters>
示例:a=fmtp:111 minptime=10;useinbandfec=1
表示PayloadType值为111的数据(Opus数据):以10ms长的音频数据为一帧,且数据经FEC(Forward Error Correction,前向纠错)编码。
结合起来分析:
Media Description, name and address (m): video 0 RTP/AVP 96
Media Attribute (a): rtpmap:96 H264/90000
Media Attribute (a): fmtp:96 packetization-mode=1; sprop-parameter-sets=Z2QAKKzZQHgGWwFqAgICgAAAAwCAAAAYB4wYyw==,aOvjyyLA; profile-level-id=640028
Media Attribute (a): control:streamid=0
我是video媒体类型,目前接口为0,,使用RTP/AVP协议,使用媒体格式编号为96
rtpmap 则说明 96代码的是 h264编码,时钟速率为90000
fmtp (format parameters)说明 96媒体数据的格式 :
packetization-mode =1;
sprop-parameter-sets = Z2QAKKzZQHgGWwFqAgICgAAAAwCAAAAYB4wYyw==,aOvjyyLA;
profile-level-id=640028
control:streamid=0 说明ffmpeg对应的streamid 为0
例子
Session Description Protocol
Session Description Protocol Version (v): 0
Owner/Creator, Session Id (o): - 0 0 IN IP4 127.0.0.1
Session Name (s): No Name
Connection Information (c): IN IP4 192.168.245.130
Time Description, active time (t): 0 0
Session Attribute (a): tool:libavformat 60.3.100
Media Description, name and address (m): video 0 RTP/AVP 96
Media Attribute (a): rtpmap:96 H264/90000
Media Attribute (a): fmtp:96 packetization-mode=1; sprop-parameter-sets=Z2QAKKzZQHgGWwFqAgICgAAAAwCAAAAYB4wYyw==,aOvjyyLA; profile-level-id=640028
Media Attribute (a): control:streamid=0
Media Description, name and address (m): audio 0 RTP/AVP 97
Bandwidth Information (b): AS:128
Media Attribute (a): rtpmap:97 MPEG4-GENERIC/44100/2
Media Attribute (a): fmtp:97 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3; config=121056E500
Media Attribute (a): control:streamid=1
技巧:在 cmd 上打开 SDP 的log用来观察SDP的 内容
1. 启动 RTSP 服务器后
2. 使用ffmpeg 推流 或者ffplay拉流的时候 后面加上 -loglevel 40
使用推流 和 拉流的 方式打开
ffmpeg -re -i "zerenlian.mp4" -vcodec h264 -acodec aac -f rtsp -rtsp_transport tcp rtsp://192.168.245.130/test/002zerenlianmp4 -loglevel 40
ffplay -rtsp_transport tcp rtsp://192.168.245.130/test/002zerenlianmp4 -loglevel 40