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

WebRTC中sdp多媒体会话协议报文详细解读

sdp介绍

在WebRTC(Web实时通信)中,SDP(Session Description Protocol)是用来描述和协商多媒体会话的协议。它定义了会话的参数和媒体流的信息,如音视频编码格式、传输方式、网络地址等。SDP是WebRTC中一个至关重要的部分,用于不同终端之间协商媒体流的属性,以便建立实时的音视频连接。

1. SDP的作用

在WebRTC中,SDP主要用于以下几个目的:

  • 描述媒体信息:定义会话的各个媒体流(例如音频、视频、数据流)的属性和参数。
  • 协商会话参数:两个通信端通过交换SDP消息,达成关于媒体格式、网络配置和传输方式的共识。
  • 建立连接:在呼叫过程中,SDP帮助双方了解如何互相通信,例如使用哪种编解码器、协议和传输端口。

2. SDP报文的结构

一个标准的SDP报文包含多个字段,每个字段用于描述不同的会话或媒体流参数。以下是一些常见的SDP字段:

  • v=0:协议版本号。
  • o=
    :会话发起者的信息和会话ID。
  • s=:会话的名称。
  • t= :会话的起始和结束时间。
  • m= :媒体描述,包含媒体类型(如audio、video)、端口号、协议和支持的格式列表。
  • a=:会话或媒体的属性描述,例如编解码器类型、带宽要求等。

3. SDP的使用过程

在WebRTC中,SDP的交换过程通常如下:

  1. 发起方生成SDP:发起连接的一方会生成一个SDP报文,描述它支持的媒体格式、编解码器、网络配置等。
  2. SDP交换:发起方将SDP消息通过信令服务器发送给接收方。接收方收到后,解析SDP并生成自己支持的SDP消息返回给发起方。
  3. 协商成功:双方根据协商的结果设置会话的参数,并开始建立媒体流的连接。

4. SDP在WebRTC中的具体作用

SDP在WebRTC中的作用非常关键,具体表现在以下几个方面:

  • 编解码器协商:通过SDP,WebRTC的通信双方可以协商使用的音视频编解码器。例如,音频可能会使用Opus编解码器,而视频则可能使用H.264编解码器。
  • 带宽控制:SDP中可以包含带宽限制的设置,确保媒体流的质量和稳定性。
  • 网络地址和端口协商:SDP还包含了如何建立连接的详细信息,如IP地址和端口号,确保双方能够建立起直接的P2P连接。

5. SDP的示例

以下是一个典型的SDP示例:

v=0
o=- 4617733324176449515 2 IN IP4 192.168.1.1
s=-
t=0 0
m=audio 49170 RTP/AVP 0 8 97
c=IN IP4 192.168.1.1
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:97 iLBC/8000
m=video 51372 RTP/AVP 99
c=IN IP4 192.168.1.1
a=rtpmap:99 H264/90000
a=fmtp:99 profile-level-id=42e01f;packetization-mode=1

这个SDP描述了一个包含音频和视频流的会话,指定了使用的编解码器(如PCMU、PCMA、iLBC、H264)和传输协议(如RTP)。

可以看出在WebRTC中,SDP协议起着至关重要的作用,终端之间通过SDP协商媒体流的参数。

WebRTC交换sdp会话过程

通过上述介绍我们已经知道,在WebRTC(Web实时通信)中,SDP(Session Description Protocol) 用于描述多媒体会话,并在两个端点之间交换会话的配置信息,如媒体类型、编解码器、传输协议等。

WebRTC中sdp一般通过信令服务器进行交换。

WebRTC中的SDP交互过程

  1. 信令交换
    在WebRTC中,SDP的交换是通过信令协议进行的,但WebRTC本身不定义具体的信令协议,通常使用WebSocket、HTTP或其他机制。信令的目的是在两端之间交换信息,以便建立连接。

  2. 初始化SDP的创建

    • 端A:当端A发起连接请求时,它会使用RTCPeerConnection对象创建一个初始的SDP消息。端A通常会调用createOffer()方法来生成一个SDP“Offer”消息。
      const offer = await peerConnection.createOffer();
      await peerConnection.setLocalDescription(offer);
      
  3. 发送Offer
    端A将生成的SDP Offer通过信令服务器发送给端B。此Offer包含了端A的媒体要求,如支持的编解码器、分辨率、帧率等信息。

  4. 端B处理Offer

    • 端B:接收到Offer后,端B会创建自己的SDP响应(SDP Answer)。端B会根据自己的能力和要求,决定是否接受端A的媒体设置,如果需要,可以修改一些参数(比如编解码器的选择)。
      const answer = await peerConnection.createAnswer();
      await peerConnection.setLocalDescription(answer);
      
  5. 发送Answer
    端B生成的Answer会通过信令服务器发送回端A,端A接收到这个Answer后,知道端B同意了连接,并根据Answer更新自己的本地SDP。

  6. 设置远程描述
    端A收到端B的Answer后,会使用setRemoteDescription()方法设置远程SDP描述,完成整个SDP的交换过程:

    await peerConnection.setRemoteDescription(answer);
    
  7. ICE候选交换
    在SDP交换过程中,端A和端B还会交换ICE候选(ICE candidates)。ICE协议用于确保两端能够成功建立点对点连接。每当两端发现新的候选IP和端口时,它们会通过信令交换这些候选信息。

    • 端A和端B都会调用getIceCandidates()方法来收集和发送ICE候选。
    • 每当发现新的候选信息时,信令服务器会将其发送到对方。
  8. 建立连接
    一旦SDP(Offer/Answer)和ICE候选交换完成,连接就建立起来了,WebRTC就可以开始实时的数据流交换(视频、音频、数据通道等)。

总结

  1. 创建Offer:发起端(端A)创建并发送SDP Offer。
  2. 响应Offer:接收端(端B)创建并发送SDP Answer。
  3. ICE候选交换:两端通过信令交换ICE候选信息,确保连接建立。
  4. 建立连接:SDP和ICE候选协商完成后,WebRTC建立点对点连接。

sdp交换的整个过程依赖于信令服务器,从而确保SDP和ICE候选信息能够在两端点之间传递。

SDP报文结构

SDP通常在WebRTC等协议中用于描述媒体连接的会话信息。SDP报文由若干行字段组成,每一行都有特定的含义。下面我们来逐行解读一个典型的SDP报文及其各字段含义。

示例SDP报文

v=0
o=- 4617733324176449515 2 IN IP4 192.168.1.1
s=-
t=0 0
a=group:BUNDLE audio video
m=audio 49170 RTP/AVP 0 8 97
c=IN IP4 192.168.1.1
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:97 iLBC/8000
m=video 51372 RTP/AVP 99
c=IN IP4 192.168.1.1
a=rtpmap:99 H264/90000
a=fmtp:99 profile-level-id=42e01f;packetization-mode=1

1. v=0

  • v表示SDP版本。这里的值是0,表示该报文遵循SDP的标准格式。

2. o=- 4617733324176449515 2 IN IP4 192.168.1.1

  • o表示会话的发起者和会话标识符,格式为:o=<用户名> <会话ID> <版本号> <网络类型> <地址类型> <地址>
    • -:表示用户名(此处为匿名或未知)。
    • 4617733324176449515:会话标识符(ID)。
    • 2:版本号。
    • IN:表示地址的网络类型(此处为Internet)。
    • IP4:地址类型(IPv4)。
    • 192.168.1.1:会话发起者的IP地址。

3. s=-

  • s表示会话名称。-表示没有指定名称,通常是为了匿名或临时会话。

4. t=0 0

  • t表示会话的起止时间。格式为:t=<开始时间> <结束时间>,值0 0表示该会话是永久的,不指定起止时间。

5. a=group:BUNDLE audio video

  • a表示属性行。group:BUNDLE指定多个媒体流(如音频和视频)应捆绑在同一个连接中,减少网络开销。

6. m=audio 49170 RTP/AVP 0 8 97

  • m表示媒体描述行。每一行都描述一种媒体流(如音频、视频或数据流),格式为:m=<媒体类型> <端口号> <协议> <格式列表>
    • audio:媒体类型(音频)。
    • 49170:端口号。
    • RTP/AVP:使用RTP协议的音频流,AVP是音频/视频协议。
    • 0 8 97:支持的音频编解码器格式(PCMU、PCMA、iLBC)。

7. c=IN IP4 192.168.1.1

  • c表示连接信息,格式为:c=<网络类型> <地址类型> <地址>
    • IN:地址类型(Internet)。
    • IP4:协议类型(IPv4)。
    • 192.168.1.1:连接的IP地址。

8. a=rtpmap:0 PCMU/8000

  • a=rtpmap表示编解码器映射信息,格式为:a=rtpmap:<payload类型> <编解码器名称>/<采样率>
    • 0:编解码器的payload类型(PT),这里指的是PCMU。
    • PCMU/8000:使用的编解码器是PCMU(G.711),采样率为8000 Hz。

9. a=rtpmap:8 PCMA/8000

  • 同上,表示使用PCMA(G.711)编解码器,采样率为8000 Hz。

10. a=rtpmap:97 iLBC/8000

  • a=rtpmap:97 iLBC/8000:表示使用iLBC编解码器,采样率为8000 Hz。

11. m=video 51372 RTP/AVP 99

  • 另一条媒体描述行,描述视频流,端口号为51372,使用RTP协议,支持的编解码器格式为99。

12. c=IN IP4 192.168.1.1

  • 视频流的连接信息,和音频流相同,IP地址为192.168.1.1

13. a=rtpmap:99 H264/90000

  • 表示视频流使用H.264编解码器,采样率为90000 Hz。

14. a=fmtp:99 profile-level-id=42e01f;packetization-mode=1

  • a=fmtp表示额外的格式参数,格式为:a=fmtp:<payload类型> <参数>
    • 99:该条格式参数适用于payload类型99(H.264)。
    • profile-level-id=42e01f:表示H.264编码的配置,42e01f是该编码的profile和level ID。
    • packetization-mode=1:指定H.264视频流的打包模式。

总结

一个典型的SDP报文包括以下几部分:

  • 版本:协议版本。
  • 会话描述:包括会话的发起者信息和会话ID。
  • 媒体描述:详细描述媒体流的类型、端口、协议、支持的编解码器等。
  • 属性描述:如编解码器映射、格式参数等。

相关文章:

WebRTC中sdp多媒体会话协议报文详细解读

sdp介绍 在WebRTC&#xff08;Web实时通信&#xff09;中&#xff0c;SDP&#xff08;Session Description Protocol&#xff09;是用来描述和协商多媒体会话的协议。它定义了会话的参数和媒体流的信息&#xff0c;如音视频编码格式、传输方式、网络地址等。SDP是WebRTC中一个…...

贪心算法应用:硬币找零问题详解

贪心算法与硬币找零问题详解 贪心算法&#xff08;Greedy Algorithm&#xff09;在解决优化问题时表现出简洁高效的特点&#xff0c;尤其适用于特定结构的组合优化问题。本文将用2万字篇幅&#xff0c;深入探讨贪心算法在硬币找零问题中的应用&#xff0c;覆盖算法原理、正确性…...

深入理解 x86 汇编中的重复前缀:REP、REPZ/REPE、REPNZ/REPNE(进阶详解版)

一、重复前缀&#xff1a;串操作的 “循环加速器” 如果你写过汇编代码&#xff0c;一定遇到过需要重复处理大量数据的场景&#xff1a; 复制 1000 字节的内存块比较两个长达 200 字符的字符串在缓冲区中搜索特定的特征值 手动用loop指令编写循环&#xff1f;代码冗长不说&a…...

计算机网络全维度解析:架构协议、关键设备、安全机制与新兴技术深度融合

计算机网络作为当今数字化社会的基石&#xff0c;其复杂性和应用广泛性远超想象。本文将从基础架构、协议体系、关键设备、安全机制到新兴技术&#xff0c;进行全方位、深层次的解析&#xff0c;并辅以实际应用场景和案例分析。 一、网络架构与分类的深度剖析 1.1 网络分类的立…...

Docker 在 AI 开发中的实践:GPU 支持与深度学习环境的容器化

人工智能(AI)和机器学习(ML),特别是深度学习,正以前所未有的速度发展。然而,AI 模型的开发和部署并非易事。开发者常常面临复杂的依赖管理(如 Python 版本、TensorFlow/PyTorch 版本、CUDA、cuDNN)、异构硬件(CPU 和 GPU)支持以及环境复现困难等痛点。这些挑战严重阻…...

学习NuxtLink标签

我第一次接触这个标签&#xff0c;我都不知道是干嘛的&#xff0c;哈哈哈哈&#xff0c;就是他长得有点像routerLink&#xff0c;所以我就去查了一下&#xff01;哎&#xff01;&#xff01;&#xff01;真是一样的&#xff0c;哈哈哈哈&#xff0c;至少做的事情是一样的&#…...

基于PostGIS的GeoTools执行原生SQL查询制图实践-以贵州省行政区划及地级市驻地为例

目录 前言 一、空间相关表简介 1、地市行政区划表 2、地市驻地信息表 3、空间查询检索 二、GeoTools制图实现 1、数据类型绑定 2、WKT转Geometry 3、原生SQL转SimpleFeatureCollection 4、集成调用 5、成果预览 三、总结 前言 在当今这个信息爆炸的时代&#xff0c…...

MySQL字段类型完全指南:选型策略与实战应用

引言 在数据库设计中&#xff0c;字段类型的选择直接影响数据存储效率、查询性能和系统稳定性。本文将系统梳理MySQL支持的字段类型&#xff0c;结合典型应用场景与避坑指南&#xff0c;助你构建高性能、易维护的数据库结构。 一、字段类型全景图 MySQL字段类型主要分为以下五…...

NLP实战(5):基于LSTM的电影评论情感分析模型研究

目录 摘要 1. 引言 2. 相关工作 3. 方法 3.1 数据预处理 3.2 模型架构 3.3 训练策略 3.4 交叉验证 4. 实验与结果 4.1 数据集 4.2 实验结果 4.3训练日志 4.4 示例预测 5. 讨论 6. 结论 附录代码 展示和免费下载 摘要 本文提出了一种基于双向LSTM的深度学习模…...

DHCP应用

一、DHCP介绍 在LAN(局域网)中我们常会遇到以下的情况&#xff1a; 1.不知道如何配置IP地址及相关信息的员工&#xff0c;无法上网&#xff1b;2.IP地址配置冲突&#xff0c;无法上网&#xff1b;3.来访用户因不熟悉公司网络情况无法上网&#xff1b; 以上这些情况都是日常最…...

基于MATLAB的FTN调制和硬判决的实现

在数字通信中&#xff0c;FTN&#xff08;Full-Transmit-Null&#xff09;是一种调制技术&#xff0c;用于在有限带宽的信道中传输数据。FTN调制通过在符号之间插入零值&#xff0c;使得频谱在符号速率的整数倍处为零&#xff0c;从而减少频谱重叠。硬判决是一种简单的解调方式…...

涂装协作机器人:重新定义涂装工艺的智能化未来

一、涂装场景的产业变革与核心诉求 1.1 千亿级市场的技术突围战 在汽车制造领域&#xff0c;涂装车间被称为"工业化妆间"&#xff0c;其工艺质量直接影响产品溢价能力。当前行业面临三重挑战&#xff1a; 质量维度&#xff1a;传统人工喷涂存在膜厚波动15μm的行业…...

c++面向对象第4天---拷贝构造函数与深复制

含有对象成员的构造函数深复制与浅复制拷贝&#xff08;复制&#xff09;构造函数 第一部分&#xff1a;含有对象成员的构造函数 以下是一个学生 类包含日期成员出生日期的代码 #include<iostream> using namespace std; class Date { public:Date(int year,int month…...

Windows版PostgreSQL 安装 vector 扩展

问题 spring-ai在集成PGVector向量存储的时候会报错如下&#xff0c;那么就需要安装pgsql的vector扩展。 SQL [CREATE EXTENSION IF NOT EXISTS vector]; 错误: 无法打开扩展控制文件 "C:/Program Files/PostgreSQL/9.6/share/extension/vector.control": No such …...

KINGCMS被入侵

现象会强制跳转到 一个异常网站,请掉截图代码. 代码中包含经过混淆处理的JavaScript&#xff0c;它使用了一种技术来隐藏其真实功能。代码中使用了eval函数来执行动态生成的代码&#xff0c;这是一种常见的技术&#xff0c;恶意脚本经常使用它来隐藏其真实目的。 这段脚本会检…...

完美解决在pycharm中创建Django项目安装mysqlclient报错的问题(windows下)

正常情况下&#xff0c;在Windows安装mysqlclient会报错&#xff1a; 我这里用的是anaconda虚拟环境&#xff0c;安装前必须激活anacoda虚拟环境&#xff0c; 怎么激活虚拟环境&#xff1f;可以参考超详细的pycharmanaconda搭建python虚拟环境_pycharm anaconda环境搭建-CSDN博…...

『React』组件副作用,useEffect讲解

在 React 开发中&#xff0c;有时候会听到“副作用”这个词。特别是用到 useEffect 这个 Hook 的时候&#xff0c;官方就明确说它是用来处理副作用的。那什么是副作用&#xff1f;为什么我们要专门管控它&#xff1f;今天就聊聊 React 中的组件副作用。 &#x1f4cc; 什么是“…...

使用VSCode在WSL和Docker中开发

通过WSL&#xff0c;开发人员可以安装 Linux 发行版&#xff08;例如 Ubuntu、OpenSUSE、Kali、Debian、Arch Linux 等&#xff09;&#xff0c;并直接在 Windows 上使用 Linux 应用程序、实用程序和 Bash 命令行工具&#xff0c;不用进行任何修改&#xff0c;也无需使用传统虚…...

ZooKeeper 命令操作

文章目录 Zookeeper 数据模型Zookeeper 服务端常用命令Zookeeper 客户端常用命令 Zookeeper 数据模型 ZooKeeper 是一个树形目录服务,其数据模型和Unix的文件系统目录树很类似&#xff0c;拥有一个层次化结构。这里面的每一个节点都被称为&#xff1a; ZNode&#xff0c;每个节…...

解决 Ubuntu 20.04 虚拟机中 catkin_make 编译卡死问题

完整解决步骤 1. 禁用当前交换文件 sudo swapoff /swapfile 2. 删除旧的交换文件 sudo rm /swapfile 3. 使用更可靠的创建方法 # 使用 dd 命令创建交换文件&#xff08;更兼容但较慢&#xff09; sudo dd if/dev/zero of/swapfile bs1M count4096# 或者使用 truncate 命令…...

【HTML-15】HTML表单:构建交互式网页的基石

表单是HTML中最强大的功能之一&#xff0c;它允许网页收集用户输入并与服务器进行交互。无论是简单的搜索框、登录页面&#xff0c;还是复杂的多步骤调查问卷&#xff0c;表单都是实现这些功能的核心元素。本文将深入探讨HTML表单的各个方面&#xff0c;帮助您构建高效、用户友…...

一些较好的学习方法

1、网上有一些非常经典的电路&#xff0c;而且有很多视频博主做了详细的讲解。 2、有一部分拆解的UP主&#xff0c;拆解后会还原该器件的原理图&#xff0c;并一步步做讲解。 3、有两本书&#xff0c;数电、模电&#xff0c;这两本书中的内容很多都值得学习。 5、某宝上卖的…...

Redis底层数据结构之深入理解跳表(1)

在上一篇文章中我们详细的介绍了一下Redis中跳表的结构以及为什么Redis要引入跳表而不是平衡树或红黑树。这篇文章我们就来详细梳理一下跳表的增加、搜索和删除步骤。 SkipList的初始化 跳表初始化时&#xff0c;将每一层链表的头尾节点创建出来并使用集合将头尾节点进行存储&…...

鸿蒙【HarmonyOS 5】 (React Native)的实战教程

一、环境配置 ‌安装鸿蒙专属模板‌ bashCopy Code npx react-native0.72.5 init HarmonyApp --template react-native-template-harmony:ml-citation{ref"4,6" data"citationList"} ‌配置 ArkTS 模块路径‌ 在 entry/src/main/ets 目录下创建原生模块&…...

PCB设计教程【入门篇】——电路分析基础-元件数据手册

前言 本教程基于B站Expert电子实验室的PCB设计教学的整理&#xff0c;为个人学习记录&#xff0c;旨在帮助PCB设计新手入门。所有内容仅作学习交流使用&#xff0c;无任何商业目的。若涉及侵权&#xff0c;请随时联系&#xff0c;将会立即处理 目录 前言 一、数据手册的重要…...

20250529-C#知识:继承、密封类、密封方法、重写

C#知识&#xff1a;继承、密封类、密封方法、重写 继承是面向对象的三大特性之一&#xff0c;通过继承能够减少重复代码的编写&#xff0c;有助于提升开发效率。 1、继承 C#不同于C&#xff0c;只支持单继承当子类出现与父类同名的成员时&#xff0c;父类成员被隐藏&#xff0…...

从0到1,带你走进Flink的世界

目录 一、Flink 是什么&#xff1f; 二、Flink 能做什么&#xff1f; 三、Flink 架构全景概览 3.1 分层架构剖析 3.2 核心组件解析 四、Flink 的核心概念 4.1 数据流与数据集 4.2 转换操作 4.3 窗口 4.4 时间语义 4.5 状态与检查点 五、Flink 安装与快速上手 5.1 …...

springboot @value

#springboot value value 可以读取 yaml 中 的数据...

Dify-5:Web 前端架构

本文档提供了 Dify Web 前端架构的技术概述&#xff0c;包括核心组件、结构和关键技术。它解释了前端如何组织、组件如何通信以及国际化功能如何实现。 技术栈 Dify 的 Web 前端基于现代 JavaScript 技术栈构建&#xff1a; 框架&#xff1a;Next.js&#xff08;基于 React …...

深度学习赋能图像识别:技术、应用与展望

论文&#xff1a; 一、引言​ 1.1 研究背景与意义​ 在当今数字化时代&#xff0c;图像作为信息的重要载体&#xff0c;广泛存在于各个领域。图像识别技术旨在让计算机理解和识别图像内容&#xff0c;将图像中的对象、场景、行为等信息转化为计算机能够处理的符号或数据 &am…...