WebRTC 多媒体 SDP 示例与解析

webRTC中的SDP的Bundlle可能包含一个或者多个媒体块(媒体描述, 源码对应类ContentInfo),从 m= 开始到下一个 m= 行(或 SDP 结束)之间的所有属性(包括 a=)都属于同一个媒体块(media section, 源码里面对应类MediaContentDescription),下面举例一个包含音频、视频和数据通道的完整 SDP 详细说明:

完整 SDP 示例

v=0
o=- 621762799816690914 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE audio video data  # Bundle组定义
a=msid-semantic: WMS stream_label### 音频媒体块 ###
m=audio 49170 UDP/TLS/RTP/SAVPF 111 103 104  # 媒体行
c=IN IP4 192.168.1.100
a=rtcp:49171 IN IP4 192.168.1.100
a=ice-ufrag:8hhy
a=ice-pwd:38dsu82jd9sll
a=fingerprint:sha-256 A1:B2:C3:...
a=setup:actpass
a=mid:audio  # 媒体标识符
a=sendrecv
a=rtpmap:111 opus/48000/2
a=fmtp:111 minptime=10;useinbandfec=1
a=rtpmap:103 ISAC/16000
a=rtpmap:104 ISAC/32000
a=ssrc:1234567890 cname:user@example.com### 视频媒体块 ###
m=video 49172 UDP/TLS/RTP/SAVPF 96 97 98  # 媒体行
c=IN IP4 192.168.1.100
a=rtcp:49173 IN IP4 192.168.1.100
a=ice-ufrag:8hhy  # 与音频相同的ufrag/pwd
a=ice-pwd:38dsu82jd9sll
a=fingerprint:sha-256 A1:B2:C3:...  # 相同指纹
a=setup:actpass
a=mid:video  # 媒体标识符
a=sendrecv
a=rtpmap:96 VP8/90000
a=rtpmap:97 H264/90000
a=rtpmap:98 VP9/90000
a=ssrc:2345678901 cname:user@example.com### 数据通道媒体块 ###
m=application 49174 UDP/DTLS/SCTP webrtc-datachannel  # 媒体行
c=IN IP4 192.168.1.100
a=ice-ufrag:8hhy  # 相同ufrag/pwd
a=ice-pwd:38dsu82jd9sll
a=fingerprint:sha-256 A1:B2:C3:...  # 相同指纹
a=setup:actpass
a=mid:data  # 媒体标识符
a=sctp-port:5000
a=max-message-size:262144

结构解析图解

Bundle Group
音频 audio
视频 video
数据通道 data
端口 49170
编解码: Opus/ISAC
SSRC: 1234567890
端口 49172
编解码: VP8/H264/VP9
SSRC: 2345678901
端口 49174
SCTP端口: 5000

媒体块划分

1. 音频媒体块

2025-08-012025-08-012025-08-022025-08-022025-08-032025-08-032025-08-042025-08-042025-08-052025-08-052025-08-062025-08-06UDP端口 ICE参数 DTLS指纹 Opus编解码 ISAC编解码 SSRC标识 传输层媒体层音频媒体块结构

2. 视频媒体块

2025-08-012025-08-012025-08-022025-08-022025-08-032025-08-032025-08-042025-08-042025-08-052025-08-052025-08-062025-08-062025-08-072025-08-07UDP端口 ICE参数 DTLS指纹 VP8编解码 H264编解码 VP9编解码 SSRC标识 传输层媒体层视频媒体块结构

3. 数据通道媒体块

2025-08-012025-08-012025-08-012025-08-012025-08-022025-08-022025-08-022025-08-022025-08-032025-08-032025-08-032025-08-03UDP端口 SCTP端口 最大消息 ICE参数 DTLS指纹 传输层数据层数据通道媒体块结构

Bundle 机制详解

1. 共享元素

30%30%20%20%Bundle共享资源ICE参数DTLS指纹传输通道NAT映射

2. 实际端口分配

媒体类型声明端口实际使用端口原因
音频4917049170作为Bundle主通道
视频4917249170复用音频端口
数据通道4917449170复用音频端口

3. 源码中的Bundle处理

// pc/jsep_transport_controller.cc
void JsepTransportController::MaybeCreateJsepTransport() {if (bundle_group_ && bundle_group_->HasContentName(content_name)) {// 复用主传输jsep_transport = GetJsepTransportForMid(bundle_group_->FirstContentName());} else {// 创建新传输jsep_transport = CreateJsepTransport();}
}

关键设计要点

1. 媒体块独立性

AudioDescription
+codecs : vector<AudioCodec>
+bandwidth : int
+direction : MediaDirection
VideoDescription
+codecs : vector<VideoCodec>
+rtp_extensions : vector<RtpExtension>
DataDescription
+sctp_port : int
+max_message_size : int
TransportDescription
+ice_ufrag : string
+ice_pwd : string
+fingerprint : DtlsFingerprint

2. Bundle 实现机制

PeerConnectionTransportControllerNetworkStack创建Bundle组(audio,video,data)为audio创建传输通道将video/data映射到audio的通道返回ICE候选(仅audio端口)候选应用于所有Bundle媒体PeerConnectionTransportControllerNetworkStack

3. 协商过程

共享
复用
复用
Offer生成
Bundle组声明
音频描述
视频描述
数据描述
传输参数

实际应用场景

1. 多流会议系统

发布
音频
视频
屏幕共享
数据
User
PeerConnection
48kHz Opus
1080p VP9
720p VP8
文件传输

2. 性能优化效果

指标独立传输Bundle模式提升
连接建立时间800ms300ms62.5%
端口使用数3166.7%
ICE开销-
NAT穿透成功率85%95%+10%

调试技巧

1. 验证Bundle有效性

# 检查Bundle组内媒体是否兼容
grep -A 10 "m=" offer.sdp | grep -E "a=mid:|a=ice-ufrag:|a=fingerprint:"# 预期输出应显示相同的ufrag和fingerprint
a=mid:audio
a=ice-ufrag:8hhy
a=fingerprint:sha-256 A1:B2:C3:...
--
a=mid:video
a=ice-ufrag:8hhy
a=fingerprint:sha-256 A1:B2:C3:...
--
a=mid:data
a=ice-ufrag:8hhy
a=fingerprint:sha-256 A1:B2:C3:...

2. 关键日志点

// 检查Bundle组创建
RTC_LOG(LS_INFO) << "Created bundle group with mids: "<< bundle_group.ToString();// 验证传输复用
RTC_LOG(LS_VERBOSE) << "Reusing transport for mid=" << mid<< " from primary mid=" << primary_mid;

3. 网络抓包分析

# 显示Bundle端口的流量
udp.port == 49170 && (rtp || sctp || dtls)

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

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

相关文章

SpringBoot 启动富文本文字更改

正常来说 SpringBoot启动时候&#xff0c;展示的文字是这个 、 主播这边想要换一个样式&#xff0c;换一个自己自定义的文字 这边换成了自己的博客名字 具体实现操作如下 在项目目录 resources下创建一个名字为banner.txt的文本&#xff0c;这是SpringBoot启动的时候寻找的…

基于结构熵权-云模型的铸铁浴缸生产工艺安全评价

一、评价模型核心思想 结构熵权法 解决传统熵权法忽略指标间结构关系的问题,通过指标层次网络计算权重。 步骤: 构建工艺安全评价指标体系(树状/网络结构) 计算同级指标间的影响度矩阵 引入修正熵权:wj=1−Ej∑(1−Ek)结构影响因子w_j = \frac{1 - E_j}{\sum (1 - E_k)} \…

[Linux]从零开始的vs code交叉调试arm Linux程序教程

一、前言 最近的项目中需要集成rknn的视觉识别&#xff0c;在这之前我并且没有将rknn集成到自己项目的经验。这里我需要在rknn原本demo的基础上我还需要集成自己的业务代码。但是又有一个问题&#xff0c;原本rknn我们都是使用交叉编译编译到开发板上的&#xff0c;并且我们还要…

视频号私信自动化回复插件

给自己的浏览器插件又增加了视频号斯信的自动化回复搜索&#xff1a;程序员老狼主体逻辑就是&#xff0c;不停的点击打招呼和斯信那个tab切换查看有无小红点&#xff0c;有小红点的会话&#xff0c;就点击。查看有无打招呼&#xff0c;有打招呼就点击&#xff0c;抓取昵称和内容…

Web前端实现银河粒子流动特效的3种技术方案对比与实践

文章目录 前端实现银河粒子流动特效的技术原理与实践 引言:银河粒子特效的技术背景与现状 技术发展历史 当前技术现状 技术原理与实现方案 思维导图:银河粒子特效技术架构 1. CSS3实现方案 基础实现代码 性能优化技巧 2. Canvas 2D实现方案 基础实现代码 Canvas高级优化技术 …

Linux:告别Jammy,拥抱Noble!WSL Ubuntu 22.04 到 24.04 LTS 终极升级指南

大家好&#xff01;如果大家和我一样&#xff0c;是Windows Subsystem for Linux (WSL) 的忠实用户&#xff0c;那么大家一定对Ubuntu在其中的表现印象深刻。我们中的许多人可能还在使用稳定可靠的Ubuntu 22.04 LTS (Jammy Jellyfish)。但现在&#xff0c;一个更令人兴奋的时代…

江协科技STM32 11-1 SPI通信协议

本节课我们将继续学习下一个通信协议&#xff0c;SPI。SPI通信和我们刚刚学习过的I2C通信差不多。两个协议的设计目的都一样都是实现主控芯片和各种外挂芯片之间的数据交流&#xff0c;有了数据交流的能力&#xff0c;我们的主控芯片就可以挂载并操纵各式各样的外部芯片&#x…

预过滤环境光贴图制作教程:第一步 - HDR 转立方体贴图

在基于物理的渲染(PBR)中,环境光贴图是实现真实光照效果的核心组件之一。而将 HDR 全景图转换为立方体贴图,是制作预过滤环境光贴图的基础步骤。本教程将详细讲解如何实现这一转换过程。 什么是 HDR 转立方体贴图? HDR(高动态范围)全景图通常以等矩形投影(Equirectan…

02 深度学习介绍【动手学深度学习v2】| 学习笔记

1、intro自然语言处理虽然我们过去取得了很大的进展&#xff0c;但是实际上还是停留在感知层面。计算机视觉领域&#xff0c;因为图片里面都是像素&#xff0c;像素很难用符号学来解释&#xff0c;所以计算机视觉大部分是用概率模型或机器学习来做。深度学习它是机器学习的一种…

智能学号抽取系统V5.6.4重磅发布

告别随机数&#xff0c;拥抱智能点名&#xff01;—— 全新升级的“智能学号抽取系统V5.6.4”重磅发布&#xff01; 摘要&#xff1a; 还在为课堂随机提问、活动抽奖而手动翻名单、查表格而烦恼吗&#xff1f;还在忍受传统点名工具的简陋和不智能吗&#xff1f;今天&#xff0…

Leetcode-141.环形链表

dict和set 1. 结构上的区别&#xff1a;类型键&#xff08;Key&#xff09;值&#xff08;Value&#xff09;示例dict有有{a: 1, b: 2}set有没有{a, b} dict 是**键值对&#xff08;key-value&#xff09;**的集合。set 是只有键&#xff08;key&#xff09;没有值的一组唯一元…

调节步进电机速度时调PSC和调ARR的区别

在步进电机控制中&#xff0c;调节速度通常是通过改变脉冲频率实现的。代码中选择调节ARR&#xff08;Auto-Reload Register&#xff09;而非PSC&#xff08;Prescaler&#xff09;的原因如下&#xff1a; 1. ARR 与 PSC 的核心区别 • ARR&#xff08;自动重载寄存器&#xff…

在 AKS 中运行 Azure DevOps 私有代理-1

简介 配置 Azure DevOps 私有代理的传统方法是将其部署在虚拟机 (VM) 上。然而,一个有趣的替代方案是利用 Azure Kubernetes 服务 (AKS) 来实现此目的。 本文将指导您如何使用 Helm Chart 在 AKS 集群中设置 Azure DevOps 私有代理,并提供该过程的分步说明。 在 AKS 中部署…

C# _Json数据

目录 1、添加Json库 2、数据序列化&#xff08;对象转 JSON&#xff09;和反序列化&#xff08;JSON 转对象&#xff09;操作 3、序列化 创建和读取Json数据 创建Json数据 定义一个CreateJson方法 读取 解析 Json数据 定义一个ReadJson方法 4、程序运行结果 在 C# 中&…

JavaScript 原始值与引用值

JavaScript 原始值与引用值 ECMAScript变量可以包含两种不同类型的数据&#xff1a;原始值和引用值。 原始值&#xff08;primitive value&#xff09;就是最简单的数据&#xff0c;引用值&#xff08;reference value&#xff09;则是由多个值构成的对象。 保存原始值的变量是…

linux中挂载磁盘和卸载

查找磁盘 找到你想要挂载的磁盘。可以使用lsblk或fdisk -l命令来查看系统中所有的磁盘和分区信息。 lsblk 对数据盘进行分区 在fdisk交互界面里&#xff0c;按以下步骤操作 fdisk /dev/vdb- 输入n来创建新分区。 - 按照提示设置分区的起始扇区、结束扇区等信息&#xff0c;…

java8学习笔记-Stream流

JDK1.8新增了Stream类&#xff0c;从而把函数式编程的风格引入到Java语言中&#xff0c;Stream类的API提供了强大的功能&#xff0c;使用Stream后&#xff0c;可以写出更加强大&#xff0c;更加简洁的代码首先&#xff0c;Stream流有一些特性&#xff1a;Stream流不是一种数据结…

Flutter开发 dart语言基本语法

特点 Dart语言支持JIT与AOT。 Dart语言采用单线程模型。 Dart语言是强类型编程语言&#xff0c;但是允许弱类型语言式编程。 基本语法 1.变量和常量 变量 var、object、dynamic关键字或数据类型显式声明变量。 命名规则&#xff1a; 变量名称必须由数字、字母、下划线或$组成&a…

SpringBoot:基于 Redis 自定义注解实现后端接口防重复提交校验(幂等操作)

SpringBoot&#xff1a;基于 Redis 自定义注解实现后端接口防重复提交校验&#xff08;幂等操作&#xff09;可基于 时间间隔 和 用于幂等判断的参数名称 实现防重复提交校验 客户端发送请求 ↓ [Spring Boot 应用入口]↓ ┌─────────────────────────…

【语音技术】意图与语料

目录 1. 意图 1.1. 意图分类 1.1.1 入口意图&#xff08;Entry Intent&#xff09; 1.1.2 对话意图&#xff08;Dialog Intent&#xff09; 1.2. 意图类型切换操作步骤 2. 语料 2.1 语料分类详解 2.2 语料编写规范详解 2.3 标签符号深度说明 3. 词槽 3.1 符类型要求 …