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示例:

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"消息。

      javascript 复制代码
      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的媒体设置,如果需要,可以修改一些参数(比如编解码器的选择)。

      javascript 复制代码
      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的交换过程:

    javascript 复制代码
    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。
  • 媒体描述:详细描述媒体流的类型、端口、协议、支持的编解码器等。
  • 属性描述:如编解码器映射、格式参数等。
相关推荐
地狱为王7 小时前
基于VLC的Unity视频播放器(四)
unity·游戏引擎·音视频
s1533510 小时前
8.RV1126-OPENCV 视频中添加LOGO
人工智能·opencv·音视频
sukalot13 小时前
window 显示驱动开发-提供视频解码功能(二)
音视频
Oliverro17 小时前
EasyRTC嵌入式音视频通信SDK音视频功能驱动视频业务多场景应用
人工智能·音视频
楠目18 小时前
MP4文件声音与视频分离
音视频·pr剪辑
WebCsDn_TDCode18 小时前
正则表达式检测文件类型是否为视频或图片
javascript·正则表达式·音视频
阿幸软件杂货间18 小时前
video-audio-extractor:视频转换为音频
音视频
nangonghen20 小时前
实时通信RTC与传统直播的异同
实时音视频·直播·rtc
阿飞__21 小时前
C++ 使用 ffmpeg 解码本地视频并获取每帧的YUV数据
c++·ffmpeg·音视频
技术小丁21 小时前
让音乐“看得见”:使用 HTML + JavaScript 实现酷炫的音频可视化播放器
javascript·html·音视频