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
英文地址,請注明出處:http://en.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 符類型要求 …