FFmpeg 4.3 音视频-多路H265监控录放C++开发二十一.4,SDP协议分析

SDP在4566 中有详细描述。

SDP 全称是 Session Description Protocol,

翻译过来就是描述会话的协议。

主要用于两个会话实体之间的媒体协商。

什么叫会话呢,比如一次网络电话、一次电话会议、一次视频聊天,这些都可以称之为一次会话。

那为什么要去发这个描述文本呢,主要是为了解决参与会话的各成员之间能力不对等的问题,如果参加本次通话的成员都支持高质量的通话,但是我们没有去进行协议,为了兼容性,使用的都是普通质量的通话格式,这样就很浪费资源了。所以 SDP 的作用还是很有必要的。
SDP(Session Description Protocol) 完全是⼀种会话描述格式 ― 它不属于传输协议 ― 它只使⽤不 同的适当的传输协议,包括会话通知协议(SAP)、会话初始协议(SIP)、 实时流协议(RTSP)、 MIME 扩展协议的电⼦邮件以及超⽂本传输协议(HTTP)。SDP协议是也是基于⽂本的协议,这样就能保 证协议的可扩展性⽐较强,这样就使其具有⼴泛的应⽤范围。SDP 不⽀持会话内容或媒体编码的协商,所 以在流媒体中只⽤来描述媒体信息。媒体协商这⼀块要⽤ RTSP 来实现.

SDP 协议结构 key = value

key 一般是一个字母,

value 的值由key的啥 对应不同的值

协议中的特殊符号 *

OPTIONAL items are marked with a "*".
在协议中 用 * 表示 是 可选的
如果没有 *,则表示是 必选的

由两大部分组成 或者三大部分组成,原始协议中将会话时间和重复信息划分到 (time description中)

协议部分说明是三大部分

Session description
v= (protocol version)
o= (originator and session identifier)
s= (session name)
i=* (session information)
u=* (URI of description)
e=* (email address)
p=* (phone number)
c=* (connection information -- not required if included in
all media)
b=* (zero or more bandwidth information lines)
One or more time descriptions ("t=" and "r=" lines; see below)
z=* (time zone adjustments)
k=* (encryption key)
a=* (zero or more session attribute lines)
Zero or more media descriptions
Time description
t= (time the session is active)
r=* (zero or more repeat times)
Media description, if present
m= (media name and transport address)
i=* (media title)
c=* (connection information -- optional if included at
session level)
b=* (zero or more bandwidth information lines)
k=* (encryption key)
a=* (zero or more media attribute lines)

会话级别信息

协议版本号(v)(必选)

version的缩写

作用:⼀个会话描述的开始,前⼀个会话结束标志。

描述: 表示sdp的版本号,不包含次版本号
例子:v=0

会话源(o)(必选)

origin的缩写

作用:(会话源或者会话⽣成者,以及会话标识符)
格式如下
o=<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address>
其中 username、session-id、nettype、addrtype、unicast-address ⼀起,唯⼀标识⼀
个会话
各字段含义如下:
username:发起者的⽤户名,不允许存在空格,如果应⽤不⽀持⽤户名,则为 - 。
sess-id:会话id,由应⽤⾃⾏定义,规范的建议是NTP(Network Time Protocol)时间戳。
sess-version:会话版本,⽤途由应⽤⾃⾏定义,只要会话数据发⽣变化时(⽐如编码),sess
version随着递增就⾏。同样的,规范的建议是NTP时间戳。
nettype:⽹络类型,⽐如 IN 表示 Internet 。
addrtype:地址类型,⽐如 IP4 、 IV6
unicast-address:域名,或者IP地址。
例子: o=jdoe 2890844526 2890842807 IN IP4 10.47.16.5

会话名称(s)(必选)

Session Name 的缩写

(会话名称)这个字段是个⽂本字符串,可以显示给会话参与者。

s=SDP Seminar

s=No Name

时间描述(t)(必选)

(会话时间)这个字段指明会话开始时间与结束时间。
例子
t=2873397496 2873404696
t=0 0

  • 描述:t字段描述了会话的开始时间和结束时间, 为 NTP时间,单位是秒;如果 为0表示过了之后,会话一直持续;当 和 都为0的时候,表示持久会话,如拉实时流;

属性(a)(可选)一般都会有值

a=<attribute>
a=<attribute>:<value>
可选字段中,连接信息字段是特别与条件相关的。因为该字段定义了数据应发送到的⽹络地址,所以必须 被包含进会话描述中的某个地⽅。
例子
a=tool:libavformat 60.3.100

会话信息(i)(可选)

(会话信息)对字段的⽂本描述,提供了⽐会话名称更多的信息。该字段既可以⽤于会话级也可以⽤ 于媒体级。

例子
i=A Seminar on the session description protocol

URI(u)(可选)

(描述的URI地址)URI信息,通过这个地址可以获取更多会话相关信息。例如,⼀个会议可能公布 在WEB⻚⾯上,所以需要该WEB的URI。每个会话只能提供⼀个URI
例子

u=http://www.example.com/seminars/sdp.pdf

E-mail地址(e)(可选)

E=(E-mail地址)负责会话个体的E-mail地址,可以有多个。只能⽤于会话级别。
例子
e=j.doe@example.com (Jane Doe)

电话号码(p)(可选)

可以有多个,会话级别。
例子:
p=+1 617 555-6011
这里没有查到在国内应该怎么写电话号码,在协议中的例子 有 +,有 -,从例子中可以看到,不止是数字,应该+和-也能用

连接信息(c)(可选)

Connection Data
(连接信息)该字段提供连接数据,包括网络类型、地址类型和连接地址。可应⽤于会话级也可以⽤ 于媒体级

  • network type:网络类型,一般为IN,表示internet;
  • address type:地址类型,一般为IP4;
  • connection address,地址,可能为域名或ip地址两种形式;
    在会话级时: c=IN IP4 224.2.17.12/127
    在媒体级时:

带宽信息(b)(可选)

(带宽信息)指明带宽需求,单位 kbit/s , 可⽤于两个级别
b=<bwtype>:<bandwidth>

  • 描述:该选项描述了建议的带宽,单位 kbs/s,可选,modifier包括两种类型,CT和AS,CT表示总带宽,AS表示单个媒体带宽的最大值;bandwidth表示具体的带宽;

重复信息(r)(可选)

r=(重复次数)如果是有规律的⽇程安排活动,这个字段⽤来指明会话重复频次和时间。
r=<repeat interval> <active duration> <offsets from start-time>
重复间隔
活动持续时间
与开始时间的偏移
r=7d 1h 0 25h
d - days (86400 seconds)
h - hours (3600 seconds)
m - minutes (60 seconds)
s - seconds (allowed for completeness)

时区调整(z)(可选)

(时区调整)⽤于按⽇程安排的有规律活动会话。会话可能会夸时区,避免时区变更造成的混乱。
z=<adjustment time> <offset> <adjustment time> <offset> ....
z=2882844526 -1h 2898848070 0

加密密钥(k)(可选)

(加密密钥)为了对媒体加密、解密,该字段提供了⼀个加密密钥或者规定了⼀个获取密钥的机制。 可⽤于两个级别。
k=<method>
k=<method>:<encryption key>
k=clear:<encryption key>
k=base64:<encoded encryption key>
k=uri:<URI to obtain key>
k=prompt

媒体级别信息

媒体描述(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
该例子说明, 可以理解为 m 是video的,端口号由于还没有指定目前为0,传输协议为RTP/AVP,媒体格式为96(协议中称之为 payload type),这个96是啥意思呢?在 a=rtpmap中说明了,对应的编码名称为h264, clock rate为90000.。。关于a的详尽说明,参考后面a属性的说明。
fmt list : 对应对应的⾳频负载类型(PT) 如果格式列表中 列出了所⽀持的所有不同类型的媒体格式。优先使⽤靠前的格式。( 15 3 0 )
格式列表中只有一个的例子
m=video 0 RTP/AVP 96
如果某个系统准备在端⼝ 45678 可以处理⼏种编码的语⾳: G.728 编码格式(负载类型为15)、 GSM 编码 格式(负载类型为3)、 G.711 u 编码格式(负载类型为0),⽽且系统优先采⽤ G.728 格式,则相应的媒体 信息如下所示:
格式列表中支持多个的例子
m=audio 45678 RTP/AVP 15 3 0

媒体信息(i)(可选)

协议中关于在媒体信息中的说明如下:
i=* (media title)

连接信息(c)(会话级进⾏了规定,这⾥可选)

带宽信息(b)(可选)

加密密钥(k)(可选)

属性(a)(可选,但是一般都要填充)

属性有两种形式,第⼀种是特征属性,第⼆种属于值属性。SDP描述了多个建议属性。

a=<attribute>
a=<attribute>:<value>

特征属性:

例如a=sendonly 表明会话描述的发送者只希望发送数据⽽不打算接收数据,端⼝号⽆意义,可以置为0。
例如 a=recvonly 表明这个会话描述的发送者只想接收数据⽽不打算发送数据。

值属性:

a= rtpmap 在协议中,SIP建议尽量 使用该属性 ,因此要特别分析一下
格式:a=rtpmap:(净荷类型)(编码名)/(时钟速率)【/(编码参数)】
a=rtpmap:<payload type> <encoding name>/<clock rate> [/<encoding parameters>]
a=control:(⾳/视频连接信息)
a=control:rtsp://192.168.1.197/h264stream0/trackID=0
a=rtpmap:96 H264/90000
a=rtpmap
rtpmap 属性提供了⼀个在 VoIP 应⽤中的重要属性使⽤⽅法,该属性可⽤于媒体流,在媒体格式不是静态的 RTP 负载类型时特别有⽤。
严格来说, "rtpmap" 只在使⽤动态负载类型情况下才是必须的,例如标准的 G.711 语⾳是静态 RTP 负载类 型,采⽤如下⽅法就可以对它完整描述:
m=audio 45678 RTP/AVP 0
⽽对动态负载来说需要指定更多信息才能使远端完全识别到媒体编码,例如 16 位线性编码 16kHz 取样的⽴ 体声⾳就是⼀个动态 RTP 负载类型,如果我们采⽤动态负载类型 98 表示这个媒体流,那么 SDP 格式如下:
m=audio 45678 RTP/AVP 98
a=rtpmap 98 L16/16000/2
SIP 建议⽆论是静态负载还是动态负载,尽量都要采⽤该属性

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

相关推荐
小gpt&3 小时前
01 音视频知识学习(视频)
c++·qt·学习·ffmpeg·音视频
TSINGSEE3 小时前
AI+视频监控电力巡检:EasyCVR视频中台方案如何赋能电力行业智能化转型
服务器·人工智能·音视频
学习嵌入式的小羊~3 小时前
读取解码视频数据并写入共享内存
音视频
Black蜡笔小新4 小时前
WebRTC技术在音视频处理上的难点剖析:EasyRTC嵌入式视频通话SDK的优化策略
人工智能·大模型·音视频·webrtc
TSINGSEE4 小时前
嵌入式音视频通话SDK组件EasyRTC:全平台设备兼容,智能硬件里的WebRTC调用实践
网络协议·音视频·webrtc·实时音视频·p2p·智能硬件
EasyCVR4 小时前
EasyRTC嵌入式音视频通话SDK:基于纯C语言的跨平台实时通信系统设计与实践
linux·c语言·开发语言·音视频·webrtc·h.265
EasyCVR4 小时前
JavaScript API与WebRTC技术解析:EasyRTC嵌入式视频通话SDK的实现
javascript·音视频·webrtc
Yeauty4 小时前
三分钟掌握音视频处理 | 在 Rust 中优雅地集成 FFmpeg
rust·ffmpeg·音视频
F0099884 小时前
全面解析与实用指南:如何有效解决ffmpeg.dll丢失问题并恢复软件正常运行
ffmpeg·dll修复工具·dll修复·dll丢失·dll丢失的解决办法
长沙红胖子Qt4 小时前
ffmpeg实用技巧:使用ffmpeg命令行从视频文件中提取帧画面并保存为图片
ffmpeg·帧提取