WebRTC(八):SDP

SDP

概念

  • SDP 是一种描述多媒体通信会话的文本格式(基于 MIME,RFC 4566)。
  • 本身 不传输数据,仅用于在会话建立阶段传递信息。
  • 常与 SIP(VoIP)、RTSP、WebRTC 等协议配合使用。

用途

  • 描述媒体类型(音频、视频等);
  • 指定编解码器、媒体格式;
  • 提供媒体的传输信息(IP 地址、端口、传输协议等);
  • 协商媒体能力(能力协商);
  • 描述时钟信息(同步);
  • 支持多路流(多 track)。

结构

字段含义示例说明
v=协议版本v=0始终为 0,表示 SDP 的版本
o=会话起始者o=john 2890844526 2890842807 IN IP4 192.0.2.1包含用户名、会话 ID、版本号、网络类型、地址类型和 IP 地址
s=会话名称s=Example Session必填项,但可为任意字符串
i=会话信息i=A demo of SDP可选项,对会话的简要描述
u=URIu=http://example.com可选项,指向更多信息
e=电子邮件地址e=john@example.com可选项
p=电话号码p=+1 555 555 5555可选项
c=连接信息c=IN IP4 203.0.113.1指定媒体的传输地址(可用于全局或每个媒体段)
b=带宽信息b=AS:2000可选,AS 表示应用带宽,单位 kbps
t=会话活动时间t=0 0表示会话起止时间,0 0 表示无限期
r=重复时间r=604800 3600 0 90000可选项,描述周期性会话
z=时区调整z=2882844526 -3600 2898848070 0可选项,调整为夏令时等
k=加密密钥k=clear:password已弃用,不推荐使用
a=属性字段多种形式详见下文“属性字段详解”
m=媒体信息m=audio 49170 RTP/AVP 0定义媒体类型、端口、传输协议和 payload type
y=会话标识符(非标准)-某些系统私有扩展
f=格式参数(非标准)-某些系统私有扩展

WebRTC中的SDP

在 WebRTC 中,SDP(Session Description Protocol) 是用于完成多媒体会话协商的关键格式,尽管 WebRTC 本身并不强依赖 SDP 协议(也有 ORTC 替代方案),但当前主流实现如 Chrome、Firefox、Safari 都基于 SDP 的 Offer/Answer 模型进行媒体协商。

基本结构

WebRTC 中 SDP 文本结构遵循 SDP 规范(RFC 4566)+ 一些扩展,主要由两部分组成:

  • Session-level(全局)字段:描述整个会话的元数据;
  • Media-level 字段:每个音频、视频流的参数(每个 m= 开头段落)。

常见结构如下:

v=0                    # SDP版本
o=- 12345 2 IN IP4 0.0.0.0    # 会话起始者
s=-                    # 会话名(必须字段)
t=0 0                  # 时间
a=group:BUNDLE 0 1     # BUNDLE分组
a=msid-semantic: WMS   # Media Stream 语义m=audio 9 UDP/TLS/RTP/SAVPF 111
...m=video 9 UDP/TLS/RTP/SAVPF 96
...

SDP字段

会话级别字段(Session-Level)

字段示例说明
v=v=0版本号,固定为 0
o=o=- 123456 2 IN IP4 127.0.0.1会话拥有者:用户名、会话ID、版本、IP等
s=s=-会话名,必须存在但可为 -
t=t=0 0时间,0 0 表示永远有效
a=group:BUNDLE 0 1表示将 media MID 为 0 和 1 的媒体复用到一个 DTLS/ICE 通道
a=msid-semantic: WMS表示支持 MediaStream 概念
a=ice-lite某些场景中表示是 ICE Lite 模式的端(如 SFU)

媒体描述字段(Media-Level)

m= 行:媒体定义
m=audio 9 UDP/TLS/RTP/SAVPF 111

含义:

  • audio:媒体类型
  • 9:端口(通常为 9,占位,由 ICE 协商真实端口)
  • UDP/TLS/RTP/SAVPF:传输协议,表示使用 SRTP over DTLS
  • 111:payload type,用于后续 a=rtpmap 对应实际编解码器
ICE 相关字段(NAT 穿透)
字段示例说明
a=ice-ufraga=ice-ufrag:F7gIICE用户名
a=ice-pwda=ice-pwd:x9cml/Yz...ICE密码
a=candidate:a=candidate:1 1 udp 2130706431 192.168.1.2 5000 typ host描述网络候选地址(host, srflx, relay)
a=end-of-candidates表示候选地址发送完毕
a=ice-options:trickle表示支持 trickle ICE(边发送边收集候选)
DTLS 安全字段(加密通道)
字段示例说明
a=fingerprint:a=fingerprint:sha-256 AB:CD:...DTLS 指纹,用于身份验证
a=setup:a=setup:actpass指示 DTLS 握手的角色:active / passive / actpass(默认)
媒体流属性
字段示例说明
a=mid:0媒体 ID,与 group:BUNDLE 搭配使用
a=sendrecv表示媒体方向,其他有 sendonly, recvonly, inactive
a=rtpmap:a=rtpmap:111 opus/48000/2映射 Payload Type 到 编解码器名称
a=fmtp:a=fmtp:111 minptime=10;useinbandfec=1格式参数(如 Opus 的 FEC)
a=rtcp-mux表示 RTP 和 RTCP 使用同一端口
a=rtcp-rsize表示使用 Reduced-Size RTCP
媒体同步与标识
字段示例说明
a=msid:stream1 track1MediaStream ID 和 Track ID,用于 Web 应用层标识流
a=ssrc:<ssrc-id> cname:<value>a=ssrc:1234 cname:abcd标识 RTP 流的同步源 SSRC 及同步名字
a=ssrc:<id> msid:<stream-id> <track-id>指定 track 对应的 ssrc

rtpmap

功能

描述 RTP 载荷类型(Payload Type)对应的编解码器信息。

SDP 中的 a=rtpmap 用于将 动态载荷类型(PT)编号 映射到 实际的编解码器名称、采样率、声道数 等信息。

语法格式
a=rtpmap:<payload-type> <codec-name>/<clock-rate>[/<channels>]
作用总结
  • 明确指定每个 PT 对应的编解码器;
  • 告诉接收方如何解析接收到的 RTP 包;
  • 提供采样率和声道信息(音频)或 RTP 时钟频率(视频);
示例
a=rtpmap:111 opus/48000/2

说明 PT 111 表示 Opus 编码,采样率 48kHz,双声道。

fmtp

功能

提供编解码器的格式化参数(Format Parameters)。

SDP 中的 a=fmtprtpmap 的扩展,用于定义该编解码器的具体参数,如打包方式、Profile、Level、纠错支持等。

语法格式
a=fmtp:<payload-type> <parameter1>=<value1>; <parameter2>=<value2>; ...
作用总结
  • 指定编解码器的高级参数;
  • 协商功能特性(如 H264 的 packetization-mode);
  • 确保发送端和接收端兼容配置,避免播放异常;
示例(H.264)
a=fmtp:109 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f

含义:

  • 允许编码解码器使用不同的 Level;
  • 使用 NALU 分片打包方式;
  • 使用 H.264 Baseline profile level 3.1

Payload Type列表

Payload TypeCodec示例 rtpmap示例 fmtp用途
111Opusa=rtpmap:111 opus/48000/2a=fmtp:111 minptime=10; useinbandfec=1音频,WebRTC 默认
103ISAC (16kHz)a=rtpmap:103 ISAC/16000音频
104ISAC (32kHz)a=rtpmap:104 ISAC/32000音频
9G722a=rtpmap:9 G722/8000音频(静态)
0PCMUa=rtpmap:0 PCMU/8000音频(静态)
8PCMAa=rtpmap:8 PCMA/8000音频(静态)
96VP8a=rtpmap:96 VP8/90000视频,兼容性好
98VP9a=rtpmap:98 VP9/90000a=fmtp:98 profile-id=0视频,高压缩率
102H264a=rtpmap:102 H264/90000level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f视频(通常会配多个)
109H264a=rtpmap:109 H264/90000同上视频(动态 PT)
100RTX (VP8)a=rtpmap:100 rtx/90000a=fmtp:100 apt=96VP8 重传流
101Telephone-eventa=rtpmap:101 telephone-event/8000DTMF

示例

v=0
o=private 51472368 2 IN IP4 0.0.0.0
s=PlaySession
t=0 0
a=ice-lite
a=group:BUNDLE 0 1
a=msid-semantic: WMS live/xxx
m=audio 9 UDP/TLS/RTP/SAVPF 111
c=IN IP4 0.0.0.0
a=ice-ufrag:02150669
a=ice-pwd:xxx
a=fingerprint:sha-256 3C:BF:C9:FA:D7:BD:14:F5:99:EA:11:0E:4D:80:70:FA:B0:58:FC:95:B2:C3:52:47:87:83:4E:CF:8A:C8:79:1F
a=setup:passive
a=mid:0
a=sendonly
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:111 opus/48000/2
a=ssrc:849342908 cname:zzz
a=ssrc:849342908 label:audio-41rt248x
a=candidate:0 1 udp 2130706431 112.118.101.218 16938 typ host generation 0
a=candidate:1 1 udp 2130706431 127.0.0.1 16938 typ host generation 0
a=candidate:2 1 udp 2130706431 112.20.4.5 16938 typ host generation 0
m=video 9 UDP/TLS/RTP/SAVPF 109
c=IN IP4 0.0.0.0
a=ice-ufrag:02150669
a=ice-pwd:xxx
a=fingerprint:sha-256 3C:BF:C9:FA:D7:BD:14:F5:99:EA:11:0E:4D:80:70:FA:B0:58:FC:95:B2:C3:52:47:87:83:4E:CF:8A:C8:79:1F
a=setup:passive
a=mid:1
a=sendonly
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:109 H264/90000
a=fmtp:109 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=ssrc:849342909 cname:xxx
a=ssrc:849342909 label:video-6v319bim
a=candidate:0 1 udp 2130706431 112.118.101.218 16938 typ host generation 0
a=candidate:1 1 udp 2130706431 127.0.0.1 16938 typ host generation 0
a=candidate:2 1 udp 2130706431 112.20.4.5 16938 typ host generation 0

会话级字段(全局)

v=0
  • SDP 协议版本,始终为 0。
o=private 51472368 2 IN IP4 0.0.0.0
  • o=用户名(private);
  • 51472368:会话ID;
  • 2:版本号(每次修改递增);
  • IN IP4 0.0.0.0:网络类型和地址(一般占位符,实际由 ICE 决定)。
s=PlaySession
  • 会话名称,可为任意字符串。
t=0 0
  • 表示 SDP 会话有效期为永久(起始时间 = 截止时间 = 0)。
a=ice-lite
  • 表示该端是 ICE-lite 模式(常用于服务端,如 SFU,表示只被动响应 ICE 协商,不发起连接)。
a=group:BUNDLE 0 1
  • 表示启用 BUNDLE,将 MID 为 0(音频)和 1(视频)的媒体流复用在同一个传输通道上(节省端口/资源)。
a=msid-semantic: WMS live/xxx
  • 表示使用 MediaStream 语义,流名为 live/xxx,供 JavaScript 层识别 track 属于哪个 stream。

音频媒体段(m=audio)

m=audio 9 UDP/TLS/RTP/SAVPF 111
  • 音频媒体,端口为占位符 9(真实由 ICE 协商);
  • UDP/TLS/RTP/SAVPF:表示使用 DTLS 加密的 SRTP
  • 111 是 payload type,后续用 rtpmap 指定编码类型。
c=IN IP4 0.0.0.0
  • 网络地址(无实际含义,占位,真实通过 ICE 协议确定)。
a=ice-ufrag:02150669
a=ice-pwd:xxx
  • ICE 协商用户名片段和密码,用于 STUN 交互过程。
a=fingerprint:sha-256 3C:BF:...:1F
a=setup:passive
  • DTLS 指纹,用于验证传输安全性;
  • setup:passive 表示此端 不发起 DTLS 握手,对端应 actpass/active。
a=mid:0
  • 媒体流的唯一标识(用于 BUNDLE 映射)。
a=sendonly
  • 表示此媒体方向是只发送(如服务端推流)。
a=rtcp-mux
a=rtcp-rsize
  • 使用 RTP 和 RTCP 端口复用;
  • 使用缩减大小的 RTCP(节省带宽)。
a=rtpmap:111 opus/48000/2
  • 111 编解码器为 Opus,48kHz 采样,双声道。
a=ssrc:849342908 cname:xxx
a=ssrc:849342908 label:audio-41rt248x
  • SSRC(同步源 ID)= 849342908,用于标识此 RTP 流;
  • cname:跨媒体同步标识;
  • label:track label(供 JS 层识别)。
a=candidate:...112.118.101.218...
  • 提供 ICE 候选地址:
    • typ host 表示本地 IP;
    • generation 0 表示首次协商;
    • 提供了多个候选,包括公网、私网地址。

视频媒体段(m=video)

m=video 9 UDP/TLS/RTP/SAVPF 109
  • 视频媒体流,使用 PT = 109;
  • 支持 SRTP over DTLS。
a=rtpmap:109 H264/90000
  • PT 109 映射为 H.264 编解码器,90kHz 时钟。
a=fmtp:109 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
  • 描述 H264 的特性参数:
    • level-asymmetry-allowed=1:允许解码器水平不对称;
    • packetization-mode=1:分片模式,必需用于 WebRTC;
    • profile-level-id=42e01f:表示 Baseline Profile Level 3.1。
a=ssrc:849342909 cname:xxx
a=ssrc:849342909 label:video-6v319bim
  • 视频 RTP 流 SSRC;
  • label 标识该 track。
a=ice-ufrag:02150669
a=ice-pwd:xxx
a=fingerprint:sha-256 ...
  • 和音频共享相同的 ICE 参数;
  • 多路复用(BUNDLE)场景下,音视频媒体共享 ICE 通道(节省资源)。
a=mid:1
a=sendonly
a=rtcp-mux
  • mid:1:媒体 ID;
  • sendonly:只发送视频;
  • rtcp-mux:复用 RTP/RTCP;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/911978.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/911978.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法竞赛>力扣>周赛 | weekly-contest-455

原文链接&#xff1a;算法竞赛>力扣>周赛 | weekly-contest-455 3591.检查元素频次是否为质数 解题思路 统计每个元素出现的次数&#xff0c;判断各次数是否为质数。由于次数<100&#xff0c;可用试除法判断。 代码实现 bool isPrime(int x) {if (x < 2)retur…

Vue 2快速实现px转vw适配

Vue 2 Vue CLI 项目 px 转 vw 完整使用指南 &#x1f4cb; 概述 本指南详细介绍如何在 Vue 2 Vue CLI 项目中使用 postcss-px-to-viewport-8-plugin 插件&#xff0c;实现自动将 px 单位转换为 vw 单位的响应式设计。 &#x1f680; 第一步&#xff1a;插件安装 1.1 安装…

Android MVVM模式介绍

一、介绍 1.Model(模型) Model代表应用程序的数据和业务逻辑。它负责处理数据的获取、存储和更新&#xff0c;例如从数据库中检索数据或通过网络请求获取数据。Model通常是与UI无关的部分&#xff0c;因此可以独立测试和复用。 2. View&#xff08;视图&#xff09; View是用…

WHAT - React Native 的 Expo Router

文章目录 核心定义核心理念核心功能解析&#xff08;Features&#xff09;1. Native2. Shareable3. Offline-first4. Optimized5. Iteration6. Universal7. Discoverable 总结示例&#xff1a;页面结构如何变成导航&#xff1f; 原文&#xff1a;https://docs.expo.dev/router/…

XML读取和设置例子

在Qt C中&#xff0c;可以使用Qt的 QDomDocument类来读取、更新和保存XML文件。这个类提供了对XML文档的强大操作能力&#xff0c;支持通过DOM&#xff08;文档对象模型&#xff09;对XML进行读取、修改、添加和删除节点等操作。 下面是一个详细的例子&#xff0c;演示如何在Qt…

ubuntu 远程桌面 xrdp + frp

经测试VNC启动桌面&#xff0c;并非常规的桌面。 不如RDP好用。因此不用VNC server 一类。 直接安装xrdp 实现UBUNTU 到UBUNTU 桌面的远程共享。 sudo apt install xrdpsudo systemctl start xrdp查看状态&#xff1a; sudo systemctl status xrdp ● xrdp.service - xrdp d…

el-table表头添加说明

1、el-table-column添加render-header 2、编写render函数 renderTipsHeader(h, { column }, item) {return h(span,[h(span, column.label),h(el-tooltip,{props:{effect:dark,content:item.headertip,placement:top},},[h(i, {class:el-icon-question,style:color:#C0C4CC;mar…

【AI论文】MultiFinBen:一个用于金融大语言模型评估的多语言、多模态且具备难度感知能力的基准测试集

摘要&#xff1a;近期&#xff0c;大型语言模型&#xff08;LLMs&#xff09;的进展加速了金融自然语言处理&#xff08;NLP&#xff09;及其应用的发展&#xff0c;然而现有的基准测试仍局限于单语言和单模态场景&#xff0c;往往过度依赖简单任务&#xff0c;无法反映现实世界…

使用 .NET Core+GcExcel,生成 Excel 文件

引言 在当今数字化办公和数据处理的大环境下&#xff0c;在线生成 Excel 文件成为了许多企业和开发者的需求。.NET Core 作为一个跨平台的开源框架&#xff0c;具有高效、灵活等特点&#xff0c;而 GcExcel 是一款功能强大的 Excel 处理组件。将二者结合&#xff0c;可以方便地…

【代码解析】opencv 安卓 SDK sample - 1 - HDR image

很久没有写安卓了&#xff0c;复习复习。用的是官方案例&#xff0c;详见opencv-Android-sdk 包 // 定义包名&#xff0c;表示该类的组织路径 package org.opencv.samples.tutorial1;// 导入所需的OpenCV和Android类库 import org.opencv.android.CameraActivity; // OpenCV…

Web中间件性能调优指南:线程池、长连接与负载均衡的最佳实践

目录 引言一、Web容器线程池配置不当1.1 线程池参数的核心作用与影响1.2 线程池大小计算模型1.3 动态调优实践 二、Keep-Alive机制配置缺陷2.1 Keep-Alive的工作原理2.2 典型配置问题与影响2.3 优化配置建议 三、负载均衡策略缺失3.1 负载均衡的核心价值3.2 主流负载均衡算法对…

15个AI模拟面试平台 和 简历修改 / 真人面试平台

对15个AI模拟面试平台的详细分析&#xff0c;每个平台都将按照统一的框架进行评估。 补充重要的&#xff1a; 【1】AMA interview 听说最好&#xff0c;最贵 1. Final Round AI 网址: https://www.finalroundai.com/ 功能深度剖析: Final Round AI 提供了一套全面的求职工具…

开始使用 Elastic AI Assistant for Observability 和阿里 Qwen3

这篇文章是继之前的文章 “在本地电脑中部署阿里 Qwen3 大模型及连接到 Elasticsearch” 的续篇。如果你还没有部署好自己的 Qwen3&#xff0c;那么请阅读之前的那篇文章来安装好环境&#xff0c;然后再继续今天练习。在今天的文章中&#xff0c;我们将展示如何结合 Qwn3 和 El…

稳定币技术全解:从货币锚定机制到区块链金融基础设施

引言&#xff1a;稳定币的技术定位 根据国际清算银行&#xff08;BIS&#xff09;2025年定义&#xff1a;稳定币是以法定资产或算法机制维持价值稳定的区块链代币&#xff0c;其本质是传统金融与加密技术的接口层。 核心价值&#xff1a;解决加密货币波动性问题 → 成为DeFi生态…

syncthing忘记密码怎么办(Mac版)?

一、问题描述 syncthing安装在Mac端&#xff0c;更改原同步文件夹的路径&#xff0c;需要重新设计同步文件&#xff0c;设置了密码且忘记密码。未看见忘记密码的选项。 网上查询解决方案&#xff0c;发现只能通过修改配置文件才能继续正常访问。但是并没有在建议路径中找到配置…

半导体FAB中的服务器硬件故障监控与预防全方案:从预警到零宕机实战

&#x1f4ca; 服务器硬件故障监控与预防全方案&#xff1a;从预警到零宕机实战 关键词&#xff1a;SMART监控 RAID预警 IPMI传感器 性能基线 Prometheus Zabbix 高可用架构 一、硬件故障前的7大预警信号&#xff08;附关联工具&#xff09; 故障类型关键指标监控工具预警阈值…

一分钟了解Transformer

一分钟了解Transformer A Minute to Know About Transformer By JacksonML 1. Transformer是什么&#xff1f; Transformer模型是一种神经网络&#xff0c;它通过学习上下文及其含义&#xff0c;跟踪序列数据中&#xff08;如本句中的单词&#xff09;中的关系。Transforme…

【Ubuntu学习】嵌入式编译工具链熟悉与游戏移植

目录 一、Ubuntu 系统编译 MININIM 源码 1. 环境准备与依赖配置 2. 编译 Allegro5.2.5 引擎 ​编辑 3. 编译 MININIM 源码 4. 故障解决 5. 打包与迁移 二、嵌入式平台编译实践 1. 树莓派 3B 编译 MININIM 2. Android 平台交叉编译 三、树莓派 3B 流水灯实验&#xf…

川翔云电脑全新上线:三维行业高效云端算力新选择

一、核心定位与优势 云端虚拟工作站服务 依托云端高性能 CPU/GPU 集群&#xff0c;提供远程桌面服务&#xff0c;支持普通设备运行专业软件。 按需付费模式&#xff1a;无需采购高端硬件&#xff0c;大幅降低成本投入。生态协同优势&#xff1a;与渲染 101 同属母公司&#…

百面Bert

百面Bert Q1. Bert与Transformer有什么关系 Bert是基于Transformer架构中的Encoder进行搭建的。 具体来说&#xff0c;Bert的核心组件是几个Encoder layer的堆叠。Encoder layer中&#xff0c;也是两个子层&#xff0c;分别是注意力层和intermediate层&#xff08;Bert中的叫…