音视频入门基础:RTP专题(3)——SDP简介

news/2025/1/17 4:47:40/

一、引言

会话描述协议(Session Description Protocol,简称SDP)描述了流媒体的初始化参数,包含音视频的编解码器、源地址和时间信息。SDP协议从不会被单独使用,而依赖于RTP和RTSP等协议。SDP也作为WebRTC的组件之一,用于描述一个会话。

二、SDP官方文档下载

SDP的官方文档为《RFC 4566》(该文档替换了《RFC 2327》与《RFC 3266》),可以从RFC官网下载:» RFC Editor

进行简介之前,请各位先下载《RFC 4566》。《RFC 4566》总共有49页。本文下面所说的“页数”是指在pdf阅读器中显示的页数:

三、SDP的格式

根据《RFC 4566》第8页,一个SDP会话描述由若干行文本组成,格式如下:

<type>=<value>

其中,<type> 必须恰好是一个区分大小写的字符,而 <value> 是结构化文本,其格式取决于 <type>。一般来说 <value> 是由单个空格字符分隔的字段或自由格式的字符串,且区分大小写,除非特定字段另有规定。不得在“=”符号两侧使用空格:

 根据《RFC 4566》第9页,SDP的整体结构如下:

其中,常见的 <type>类型如下:

v:“v=”字段给出了会话描述协议的版本,目前SDP仅有一个正式版本,即v=0:

o:“o=”字段给出了会话的发起者(用户名和用户主机地址)以及会话标识符和版本。格式为:

o=<username> <sess-id> <sess-version> <nettype> <addrtype><unicast-address>

其中:

<username>:用户在源主机上的登录名,如果源主机不支持用户ID概念,则为“-”。 <username> 不得包含空格。

<sess-id>:一个数字字符串,会话的全局唯一标识符。分配<sess-id>的方法由创建工具决定,建议使用网络时间协议(Network Time Protocol,NTP)格式的时间戳以确保唯一性。

<sess-version>:会话描述的版本号。其使用由创建工具决定。只要在修改会话数据时增加, <sess-version>的值就会增加。建议使用 NTP 格式的时间戳。

<nettype>:一个文本字符串,表示网络类型。值一般为“IN”,表示“Internet”。

<addrtype>:一个文本字符串,表示后面的地址类型。值一般为IP4或IP6,表明后续地址使用的是IPv4还是IPv6。

<unicast-address>:创建会话的机器地址。

s:文本会话名称。每个会话描述必须有且仅有一个“s=”字段。s="字段不得为空,必须包含 ISO 10646 字符。如果会话没有有意义的名称,则值“s=”(即用一个空格作为会话名称):

c:包含连接数据信息。会话描述必须在每个媒体描述中至少包含一个 “c=”字段,或在会话级别包含一个 “c=”字段。格式为:

c=<nettype> <addrtype> <connection-address>

其中:

<nettype>:一个文本字符串,表示网络类型。值一般为“IN”,表示“Internet”。

<addrtype>:一个文本字符串,表示后面的地址类型。值一般为IP4或IP6,表明后续地址使用的是IPv4还是IPv6。

<connection-address>:连接地址。根据 <addrtype> 字段的值,可在连接地址后添加可选子字段,具体取决于 <addrtype> 字段的值。

b:带宽。格式为:b=<bwtype>:<bandwidth>

其中:

<bwtype>:值可以为AS(应用层信号,Application-Specific),表示总体带宽需求,或者是CT(会议总带宽,Conference Total)等特定类型。

<bandwidth>:带宽值,单位为kpbs。

t:指定会话的开始和停止时间。如果会话在不规则间隔的多个时间段启动,可以使用多个 “t=”行。每增加一个 “t=”行,就多指定一段会话的活动时间。格式为:

t=<start-time> <stop-time>

其中:

<start-time>:会话的开始时间。值用网络时间协议(NTP)时间值的十进制表示,单位是自 1900 年以来的秒数。

<stop-time>:会话的停止时间。值用网络时间协议(NTP)时间值的十进制表示,单位是自 1900 年以来的秒数。

a:该字段是扩展 SDP 的主要手段。用于添加有关媒体流的信息,或传递适用于整个会议而非单个媒体的附加信息:

m:会话描述可包含多个媒体描述。每个媒体描述都以 “m=”字段开始,以下一个 “m=”字段或会话描述的结尾结束。格式为:

m=<media> <port> <proto> <fmt> ...

其中:

<media>:媒体类型。目前定义的媒体有 "audio"、"video"、"text"、"application"和"message",但该列表将来可能会扩展。

<port>:发送媒体流的传输端口。传输端口的含义取决于相关 “c=”字段中指定的网络和传输端口。

<proto>:传输协议。含义取决于相关 “c=”字段中的地址类型字段。因此,“c=”字段中的 IP4表示传输协议通过 IP4 运行。以下是已定义的传输协议,但可通过向 IANA 注册新协议进行扩展:

udp:表示通过 UDP 运行的未指定协议。
RTP/AVP: 表示在 RTP Profile for Audio and Video Conferences with Minimal Control下使用的基于UDP的RTP。
RTP/SAVP:表示通过 UDP 运行的安全实时传输协议通过 UDP 运行。

<fmt>:媒体格式描述。取决于 <proto> 子字段的值。如果 <proto> 子字段为 “RTP/AVP ”或 “RTP/SAVP”,则 <fmt> 子字段包含 RTP 有效载荷类型编号:

a=rtpmap:该属性将 RTP 有效载荷类型编号(如 “m=”行中使用的)映射到表示有效载荷格式的编码名称。它还提供有关时钟速率和编码参数的信息。格式为:

a=rtpmap:<payload type> <encoding name>/<clock rate> [/<encoding parameters>]

a=fmtp:该属性允许以 SDP 所不具备的方式传递特定格式的参数。格式为:

a=fmtp:<format> <format specific parameters>

四、SDP实例分析

执行《音视频入门基础:RTP专题(2)——使用FFmpeg命令生成RTP流》中的“媒体文件转推RTP的FFmpeg命令”会生成一个SDP文件,该文件内容如下:

v=0
o=- 0 0 IN IP4 127.0.0.1
s=No Name
t=0 0
a=tool:libavformat 61.7.100
m=video 6005 RTP/AVP 96
c=IN IP4 192.168.0.102
b=AS:1327
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1; sprop-parameter-sets=Z2QAH6zZgFAFuwFqAgICgAAAAwCAAAAZB4wYzQ==,aOl7LIs=; profile-level-id=64001F
m=audio 7005 RTP/AVP 97
c=IN IP4 192.168.0.102
b=AS:160
a=rtpmap:97 MPEG4-GENERIC/48000/2
a=fmtp:97 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3; config=1190

下面进行逐行的分析。

v=0:表示SDP遵循版本0的规范。

o=- 0 0 IN IP4 127.0.0.1:用户名为-,此处服务器未填写实际用户名。会话标识符和会话描述的版本均为NTP时间戳,值都为0。网络类型为IN,表示Internet。地址类型为IP4,表示IPv4地址。服务器的IP地址为127.0.0.1。

s=No Name:文本会话的名称为No Name。

t=0 0:表示持久会话。即会话没有固定的开始和结束时间(无限期有效)

a=tool:libavformat 61.7.100:工具名称和版本,表明使用libavformat工具,版本为61.7.100。

m=video 6005 RTP/AVP 96:媒体类型为video,表示这是一个视频媒体流。端口为6005。传输协议为RTP/AVP,表示使用基于UDP的RTP传输,并允许在会话中协商负载类型。负载类型为96,表示视频流使用编号为96的负载类型。

c=IN IP4 192.168.0.102:网络类型为IN,表示Internet。地址类型为IP4,表示IPv4地址。连接地址为192.168.0.102。

b=AS:1327:指定媒体流所需的带宽,此处为1327kbps。

a=rtpmap:96 H264/90000:映射PT为96的负载类型到H.264编码,采样率为90000 Hz。

a=fmtp:96 packetization-mode=1; sprop-parameter-sets=Z2QAH6zZgFAFuwFqAgICgAAAAwCAAAAZB4wYzQ==,aOl7LIs=; profile-level-id=64001F:

提供PT为96的H.264编码的详细参数。其中:

packetization-mode=1:表示采用单NALU(网络抽象层单元)模式。

profile-level-id=64001F:指定H.264的Profile和Level。

sprop-parameter-sets:包含两个参数集(SPS和PPS),它们是解码视频流所必需的额外参数。

五、参考

《从零开始精通RTSP之SDP格式详解》


http://www.ppmy.cn/news/1563794.html

相关文章

论文高级GPT指令推荐

一、科研选题与方向确认二、文献综述与整理 一、科研选题与方向确认 头脑风暴选题指令&#xff1a;Brainstorm potential research topics within [你的研究领域], focusing on areas with limited existing research and significant potential impact. For each topic, prov…

基于Java的愤怒的小鸟游戏的设计与实现【源码+文档+部署讲解】

目录 摘要 Abstract 1 绪论 1.1 游戏开发的背景 1.2 典型的Java游戏介绍 1.2.1 Minecraft介绍 1.2.2 Super Mario Bros介绍 1.2.3 The Sims介绍 1.3 游戏开发的意义 2 开发环境 2.1 开发语言 2.2 开发工具 2.3 JDK介绍 2.4 Java Awt介绍 2.5 Java Swing 介绍 2.…

ZCC1923替代BOS1921Piezo Haptic Driver with Digital Front End

FEATURES • High-Voltage Low Power Piezo Driver o Drive 100nF at 190VPP and 250Hz with 490mW o Drives Capacitive Loads up to 1000nF o Energy Recovery o Differential Output o Small Solution Footprint, QFN & WLCSP • Low Quiescent Current: SHUTDOWN; …

vulnhub靶场【IA系列】之Keyring

前言 靶机&#xff1a;IA-Keyring&#xff0c;IP地址为192.168.10.11 攻击&#xff1a;kali&#xff0c;IP地址为192.168.10.2 都采用虚拟机&#xff0c;网卡为桥接模式 文章中涉及的靶场以及相关工具&#xff0c;放置在网盘中&#xff0c;链接https://pan.quark.cn/s/55d71…

安全开发 javaEE应用 servlet 路由技术 生命周期 JDBC数据库操作

前言 什么是javaEE &#xff1f; javaEE就是基本的企业开发语言 什么是servlet(翻译是小服务程序 或者 是服务连接器) 就是本地服务器和http协议的中间件 Servlet 路由 Servlet是运行在Web服务器或应用服务器上的程序,它是作为来自Web浏览器或其他HTTP客户端的请求和HT…

算法15、双指针(归并排序两种做法)

&#x1f330;1、two-Sum严格递增序列 晴问算法 因为是有序的序列&#xff08;严格递增&#xff09;所以可以考虑用二分查找的思路&#xff01; 二分查找变体版-双指针。 因为严格递增的序列特性&#xff0c;让i, j(或者left, right)的枚举互相牵制&#xff0c;因而我们可以…

AI大模型开发—1、百度的千帆大模型调用(文心一言的底层模型,ENRIE等系列)、API文档目的地

文章目录 前言一、千帆大模型平台简介二、百度平台官网初使用1、平台注册和使用2、应用注册 并 申请密钥3、开启千帆大模型 API调用a、API文档b、 前言 本章旨在为读者奉献一份实用的操作指南&#xff0c;深入探索如何高效利用百度千帆大模型平台的卓越功能。我们将从账号注册…

使用Redis防止重复发送RabbitMQ消息

问题 今天遇到一个问题&#xff0c;发送MQ消息的时候需要保证不会重复发送&#xff0c;注意不是可靠到达&#xff08;可靠到达可以通过消息确认机制和回调接口保证&#xff09;&#xff0c;这里保证的是不会生产多条一样的消息。 方法 综合讨论下来决定使用Redis缓存来解决&…