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
英文地址,請注明出處:http://en.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中的叫…