当前位置: 首页 > news >正文

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.dtcms.com/a/307671.html

相关文章:

  • 嵌入式硬件学习(十)—— LED驱动+杂项设备驱动
  • 2025电商CPS分销与推客系统小程序开发:趋势、架构与实战解析
  • SpringBoot3.x引入Quartz,持久化到MySQL数据库
  • npm 设置国内镜像源
  • 中宇联:以“智云融合+AI”赋能全栈云MSP服务,深化阿里云生态合作
  • 【YOLOv1】
  • 多云场景实战:华为手机 QR 码绑定与 AWS云服务器终端登录全解
  • 全球SPAD技术发展全景:工艺节点、产能布局与中国突破
  • 科研快报 |无人机+AI:广东防控基孔热背后的技术革命
  • 无人机传感器系统架构解析
  • 了解SQL
  • HttpServletRequest详细解释
  • HttpServletRequest 和 HttpServletResponse核心接口区别
  • UDP_千兆光通信(四)Tri Mode Ethernet MAC ip核
  • 力扣 hot100 Day61
  • Mockito:Java单元测试Mock框架
  • Mac 系统下安装 nvm
  • 工业园区泵房物联网能耗优化解决方案:打造绿色低碳厂区
  • 组播 | 不同 VLAN 间数据转发实现逻辑 / 实验
  • 深入解读OpenTelemetry分布式链路追踪:原理与实践指南
  • tlias智能学习辅助系统--SpringAOP-基础-核心概念
  • Cesium 快速入门(一)快速搭建项目
  • 防火墙安全实验
  • 10. NAT,代理服务,内网穿透
  • MLIR TableGen
  • 软考中级-信息安全工程师-每日一学(1)
  • 网关冗余技术VRRP的原理与配置
  • 相亲小程序安全与隐私系统模块搭建
  • 按键精灵iOS工具元素命令SetText:自动化输入的终极解决方案
  • 前端核心技术Node.js(二)——path模块、HTTP与模块化