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的交换过程通常如下:
- 发起方生成SDP:发起连接的一方会生成一个SDP报文,描述它支持的媒体格式、编解码器、网络配置等。
- SDP交换:发起方将SDP消息通过信令服务器发送给接收方。接收方收到后,解析SDP并生成自己支持的SDP消息返回给发起方。
- 协商成功:双方根据协商的结果设置会话的参数,并开始建立媒体流的连接。
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交互过程
-
信令交换 :
在WebRTC中,SDP的交换是通过信令协议进行的,但WebRTC本身不定义具体的信令协议,通常使用WebSocket、HTTP或其他机制。信令的目的是在两端之间交换信息,以便建立连接。
-
初始化SDP的创建:
-
端A :当端A发起连接请求时,它会使用
RTCPeerConnection
对象创建一个初始的SDP消息。端A通常会调用createOffer()
方法来生成一个SDP"Offer"消息。javascriptconst offer = await peerConnection.createOffer(); await peerConnection.setLocalDescription(offer);
-
-
发送Offer :
端A将生成的SDP Offer通过信令服务器发送给端B。此Offer包含了端A的媒体要求,如支持的编解码器、分辨率、帧率等信息。
-
端B处理Offer:
-
端B :接收到Offer后,端B会创建自己的SDP响应(SDP Answer)。端B会根据自己的能力和要求,决定是否接受端A的媒体设置,如果需要,可以修改一些参数(比如编解码器的选择)。
javascriptconst answer = await peerConnection.createAnswer(); await peerConnection.setLocalDescription(answer);
-
-
发送Answer :
端B生成的Answer会通过信令服务器发送回端A,端A接收到这个Answer后,知道端B同意了连接,并根据Answer更新自己的本地SDP。
-
设置远程描述 :
端A收到端B的Answer后,会使用
setRemoteDescription()
方法设置远程SDP描述,完成整个SDP的交换过程:javascriptawait peerConnection.setRemoteDescription(answer);
-
ICE候选交换 :
在SDP交换过程中,端A和端B还会交换ICE候选(ICE candidates)。ICE协议用于确保两端能够成功建立点对点连接。每当两端发现新的候选IP和端口时,它们会通过信令交换这些候选信息。
- 端A和端B都会调用
getIceCandidates()
方法来收集和发送ICE候选。 - 每当发现新的候选信息时,信令服务器会将其发送到对方。
- 端A和端B都会调用
-
建立连接 :
一旦SDP(Offer/Answer)和ICE候选交换完成,连接就建立起来了,WebRTC就可以开始实时的数据流交换(视频、音频、数据通道等)。
总结
- 创建Offer:发起端(端A)创建并发送SDP Offer。
- 响应Offer:接收端(端B)创建并发送SDP Answer。
- ICE候选交换:两端通过信令交换ICE候选信息,确保连接建立。
- 建立连接: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。
- 媒体描述:详细描述媒体流的类型、端口、协议、支持的编解码器等。
- 属性描述:如编解码器映射、格式参数等。