SDP的内容解析与 实例分析

作者&投稿:豆垂 (若有异议请与网页底部的电邮联系)
~ 零、背景

实时传输前,双方为了建立实时数据传输的通道, (1)交换各自的IP地址和端口号(通常是UDP,实时性更好),(2)交换各自在的数据传输时的加解密方式,(3)交换各自在传输时报文的格式标准。从而保障了数据交互。对应的,在sdp格式报文中,会把上述内容携带上,通信双方可能通过websocket或者其他的方式进行互换sdp。(用websocket很大原因是因为网页端需要接入,同时也方便好用,坑也多)

一、SDP协议介绍

SDP 完全是一种会话描述格式 ― 它不属于传输协议 ― 它只使用不同的适当的传输协议,包括会话通知协议(SAP)、会话初始协议(SIP)、 实时流协议(RTSP)、 MIME 扩展协议的电子邮件以及超文本传输协议(HTTP)。SDP协议是也是基于文本的协议,这样就能保证协议的可扩展性比较强,这样就使其具有广泛的应用范围。SDP 不支持会话内容或媒体编码的协商,所以在流媒体中只用来描述媒体信息。媒体协商这一块要用 RTSP 来实现.

二、SDP协议格式

SDP描述由许多文本行组成,文本行的格式为<类型>=<值>,<类型>是一个字母,<值>是结构化的文本串,其格式依<类型>而定。

<type>=<value>[CRLF]

主要是 video、audio的动态pt范围, 和每一种codec的preferredPT,用在两个端之间协商统一

主要是rtcp控制报文(nack,pli,remb,fir等)在两端的识别,事先统一好每一种控制报文的PT

Udp传输时,会在udp的套接字上包装一层ssl, 会需要两端交换对称加密方式

NA

核心内容,对端的UDP,ip地址和 端口

在一次会话中唯一标准一个媒体流

audio-ssrc 

video-ssrc

Codecs:

0: {kind: "audio", mimeType: "audio/opus", clockRate: 48000, channels: 2, preferredPayloadType: 100,…}

1: {kind: "video", mimeType: "video/VP8", clockRate: 90000,…}

2: {kind: "video", mimeType: "video/rtx", preferredPayloadType: 102, clockRate: 90000, rtcpFeedback: [],…}

3: {kind: "video", mimeType: "video/VP9", clockRate: 90000,…}

a=rtpmap:103 ISAC/16000\r\n

a=rtpmap:104 ISAC/32000\r\n

a=rtpmap:9 G722/8000\r\n

a=rtpmap:0 PCMU/8000\r\n

a=rtpmap:8 PCMA/8000\r\n

a=rtpmap:113 telephone-event/16000\r\n

a=rtpmap:126 telephone-event/8000\r\n

m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 122 127 121 125 107 108 109 124 120 123 119 114 115 116\r\n

m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 110 112 113 126\r\n

fecMechanisms: 不使用fec 可以不需要

headExtensions:

    audio ExtMap

    video ExtMap

定义 nack,fir pliremb 的pt

preferredPayloadType: 100

rtcpFeedback: []

a=sendonly\r\n

a=rtcp-mux\r\n

a=rtcp-rsize\r\n

a=rtpmap:96 VP8/90000\r\n

a=rtcp-fb:96 goog-remb\r\n

a=rtcp-fb:96 transport-cc\r\n

a=rtcp-fb:96 ccm fir\r\n

a=rtcp-fb:96 nack\r\n

a=rtcp-fb:96 nack pli\r\n

a=rtpmap:97 rtx/90000\r\n

a=fmtp:97 apt=96\r\n

a=rtpmap:98 VP9/90000\r\n

a=rtcp-fb:98 goog-remb\r\n

a=rtcp-fb:98 transport-cc\r\n

a=rtcp-fb:98 ccm fir\r\n

a=rtcp-fb:98 nack\r\n

a=rtcp-fb:98 nack pli\r\n

fingerprints: [{algorithm: "sha-1", value: "DB:E8:DB:EB:A6:85:7B:2A:10:10:3B:A0:7E:1E:0C:CA:64:CB:36:95"},…]

role: "auto"

iceLite: true

password: "y9fs202dur4fzvm8rek5n1befw5wogzp"

usernameFragment: "5synhr1w1yjyuudn"

a=ice-ufrag:Ksf1\r\n

a=ice-pwd:GDop22TqcfiuREGVcDlNh8Cv\r\n

a=ice-options:trickle\r\n

a=fingerprint:sha-256 F8:91:E5:A6:77:09:7A:AB:AE:94:87:95:09:53:7D:78:10:20:21:4E:10:78:E6:76:DE:FD:4E:D5:4D:FD:7D:D9\r\n

a=setup:actpass\r\n

{foundation: "udpcandidate", ip: "172.28.100.38", port: 42795, priority: 1076302079, protocol: "udp",…}

m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 110 112 113 126\r\n

...

a=ssrc:1913322051 cname:buToKXw9QTcWQHBF\r\n

a=ssrc:1913322051 msid:1jMfa2Vph7cdloTWnLDiIBh7MVKIesEwpOC3 1faaeb69-cb20-4c41-9a83-5b9316458dd7\r\n

a=ssrc:1913322051 mslabel:1jMfa2Vph7cdloTWnLDiIBh7MVKIesEwpOC3\r\n

a=ssrc:1913322051 label:1faaeb69-cb20-4c41-9a83-5b9316458dd7\r\n

——————

m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 122 127 121 125 107 108 109 124 120 123 119 114 115 116\r\n

...

a=ssrc-group:FID 4051905094 3634016184\r\n

a=ssrc:4051905094 cname:buToKXw9QTcWQHBF\r\n

a=ssrc:4051905094 msid:1jMfa2Vph7cdloTWnLDiIBh7MVKIesEwpOC3 d3674fe2-2344-43fe-aa19-832fb0425310\r\n

a=ssrc:4051905094 mslabel:1jMfa2Vph7cdloTWnLDiIBh7MVKIesEwpOC3\r\n

a=ssrc:4051905094 label:d3674fe2-2344-43fe-aa19-832fb0425310\r\n

a=ssrc:3634016184 cname:buToKXw9QTcWQHBF\r\n

a=ssrc:3634016184 msid:1jMfa2Vph7cdloTWnLDiIBh7MVKIesEwpOC3 d3674fe2-2344-43fe-aa19-832fb0425310\r\n

a=ssrc:3634016184 mslabel:1jMfa2Vph7cdloTWnLDiIBh7MVKIesEwpOC3\r\n

a=ssrc:3634016184 label:d3674fe2-2344-43fe-aa19-832fb0425310\r\n

可以参考这个:  https://blog.csdn.net/xyblog/article/details/49741267

给个例子:offer  和 answer的 sdp

offer sdp:

———————————————————————————————————>>>>

offer sdp 来源 :

pc=newRTCPeerConnection

pc.createOffer(this.offerConstraint).then(sdp=>{

let_sdp=JSON.parse(JSON.stringify(sdp));

pc.setLocalDescription(_sdp).then(_=>{

y(_sdp);

}).catch(this.onerror)

}).catch(this.onerror)

v=0\r\n

o=- 2243792401850741077 2 IN IP4 127.0.0.1\r\n

s=-\r\n

t=0 0\r\n

a=group:BUNDLE audio video\r\n

a=msid-semantic: WMS 1jMfa2Vph7cdloTWnLDiIBh7MVKIesEwpOC3\r\n

m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 110 112 113 126\r\n

c=IN IP4 0.0.0.0\r\n

a=rtcp:9 IN IP4 0.0.0.0\r\n

a=ice-ufrag:Ksf1\r\n

a=ice-pwd:GDop22TqcfiuREGVcDlNh8Cv\r\n

a=ice-options:trickle\r\n

a=fingerprint:sha-256 F8:91:E5:A6:77:09:7A:AB:AE:94:87:95:09:53:7D:78:10:20:21:4E:10:78:E6:76:DE:FD:4E:D5:4D:FD:7D:D9\r\n

a=setup:actpass\r\n

a=mid:audio\r\n

a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\n

a=extmap:2 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\n

a=sendonly\r\n

a=rtcp-mux\r\n

a=rtpmap:111 opus/48000/2\r\n

a=rtcp-fb:111 nack\r\n

a=rtcp-fb:111 transport-cc\r\n

a=fmtp:111 minptime=10;useinbandfec=1\r\n

a=rtpmap:103 ISAC/16000\r\n

a=rtpmap:104 ISAC/32000\r\n

a=rtpmap:9 G722/8000\r\n

a=rtpmap:0 PCMU/8000\r\n

a=rtpmap:8 PCMA/8000\r\n

a=rtpmap:106 CN/32000\r\n

a=rtpmap:105 CN/16000\r\n

a=rtpmap:13 CN/8000\r\n

a=rtpmap:110 telephone-event/48000\r\n

a=rtpmap:112 telephone-event/32000\r\n

a=rtpmap:113 telephone-event/16000\r\n

a=rtpmap:126 telephone-event/8000\r\n

a=ssrc:1913322051 cname:buToKXw9QTcWQHBF\r\n

a=ssrc:1913322051 msid:1jMfa2Vph7cdloTWnLDiIBh7MVKIesEwpOC3 1faaeb69-cb20-4c41-9a83-5b9316458dd7\r\n

a=ssrc:1913322051 mslabel:1jMfa2Vph7cdloTWnLDiIBh7MVKIesEwpOC3\r\n

a=ssrc:1913322051 label:1faaeb69-cb20-4c41-9a83-5b9316458dd7\r\n

m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 122 127 121 125 107 108 109 124 120 123 119 114 115 116\r\n

c=IN IP4 0.0.0.0\r\n

a=rtcp:9 IN IP4 0.0.0.0\r\n

a=ice-ufrag:Ksf1\r\n

a=ice-pwd:GDop22TqcfiuREGVcDlNh8Cv\r\n

a=ice-options:trickle\r\n

a=fingerprint:sha-256 F8:91:E5:A6:77:09:7A:AB:AE:94:87:95:09:53:7D:78:10:20:21:4E:10:78:E6:76:DE:FD:4E:D5:4D:FD:7D:D9\r\n

a=setup:actpass\r\n

a=mid:video\r\n

a=extmap:14 urn:ietf:params:rtp-hdrext:toffset\r\n

a=extmap:13 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n

a=extmap:3 urn:3gpp:video-orientation\r\n

a=extmap:2 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\n

a=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay\r\n

a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type\r\n

a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing\r\n

a=extmap:8 http://tools.ietf.org/html/draft-ietf-avtext-framemarking-07\r\n

a=extmap:9 http://www.webrtc.org/experiments/rtp-hdrext/color-space\r\n

a=sendonly\r\n

a=rtcp-mux\r\n

a=rtcp-rsize\r\n

a=rtpmap:96 VP8/90000\r\n

a=rtcp-fb:96 goog-remb\r\n

a=rtcp-fb:96 transport-cc\r\n

a=rtcp-fb:96 ccm fir\r\n

a=rtcp-fb:96 nack\r\n

a=rtcp-fb:96 nack pli\r\n

a=rtpmap:97 rtx/90000\r\n

a=fmtp:97 apt=96\r\n

a=rtpmap:98 VP9/90000\r\n

a=rtcp-fb:98 goog-remb\r\n

a=rtcp-fb:98 transport-cc\r\n

a=rtcp-fb:98 ccm fir\r\n

a=rtcp-fb:98 nack\r\n

a=rtcp-fb:98 nack pli\r\n

a=fmtp:98 profile-id=0\r\n

a=rtpmap:99 rtx/90000\r\n

a=fmtp:99 apt=98\r\n

a=rtpmap:100 VP9/90000\r\n

a=rtcp-fb:100 goog-remb\r\n

a=rtcp-fb:100 transport-cc\r\n

a=rtcp-fb:100 ccm fir\r\n

a=rtcp-fb:100 nack\r\n

a=rtcp-fb:100 nack pli\r\n

a=fmtp:100 profile-id=2\r\n

a=rtpmap:101 rtx/90000\r\n

a=fmtp:101 apt=100\r\n

a=rtpmap:102 H264/90000\r\n

a=rtcp-fb:102 goog-remb\r\n

a=rtcp-fb:102 transport-cc\r\n

a=rtcp-fb:102 ccm fir\r\n

a=rtcp-fb:102 nack\r\n

a=rtcp-fb:102 nack pli\r\n

a=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f\r\n

a=rtpmap:122 rtx/90000\r\n

a=fmtp:122 apt=102\r\n

a=rtpmap:127 H264/90000\r\n

a=rtcp-fb:127 goog-remb\r\n

a=rtcp-fb:127 transport-cc\r\n

a=rtcp-fb:127 ccm fir\r\n

a=rtcp-fb:127 nack\r\n

a=rtcp-fb:127 nack pli\r\n

a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f\r\n

a=rtpmap:121 rtx/90000\r\n

a=fmtp:121 apt=127\r\n

a=rtpmap:125 H264/90000\r\n

a=rtcp-fb:125 goog-remb\r\n

a=rtcp-fb:125 transport-cc\r\n

a=rtcp-fb:125 ccm fir\r\n

a=rtcp-fb:125 nack\r\n

a=rtcp-fb:125 nack pli\r\n

a=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\n

a=rtpmap:107 rtx/90000\r\n

a=fmtp:107 apt=125\r\n

a=rtpmap:108 H264/90000\r\n

a=rtcp-fb:108 goog-remb\r\n

a=rtcp-fb:108 transport-cc\r\n

a=rtcp-fb:108 ccm fir\r\n

a=rtcp-fb:108 nack\r\n

a=rtcp-fb:108 nack pli\r\n

a=fmtp:108 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f\r\n

a=rtpmap:109 rtx/90000\r\n

a=fmtp:109 apt=108\r\n

a=rtpmap:124 H264/90000\r\n

a=rtcp-fb:124 goog-remb\r\n

a=rtcp-fb:124 transport-cc\r\n

a=rtcp-fb:124 ccm fir\r\n

a=rtcp-fb:124 nack\r\n

a=rtcp-fb:124 nack pli\r\n

a=fmtp:124 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=4d0032\r\n

a=rtpmap:120 rtx/90000\r\n

a=fmtp:120 apt=124\r\n

a=rtpmap:123 H264/90000\r\n

a=rtcp-fb:123 goog-remb\r\n

a=rtcp-fb:123 transport-cc\r\n

a=rtcp-fb:123 ccm fir\r\n

a=rtcp-fb:123 nack\r\n

a=rtcp-fb:123 nack pli\r\n

a=fmtp:123 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=640032\r\n

a=rtpmap:119 rtx/90000\r\n

a=fmtp:119 apt=123\r\n

a=rtpmap:114 red/90000\r\n

a=rtpmap:115 rtx/90000\r\n

a=fmtp:115 apt=114\r\n

a=rtpmap:116 ulpfec/90000\r\n

a=ssrc-group:FID 4051905094 3634016184\r\n

a=ssrc:4051905094 cname:buToKXw9QTcWQHBF\r\n

a=ssrc:4051905094 msid:1jMfa2Vph7cdloTWnLDiIBh7MVKIesEwpOC3 d3674fe2-2344-43fe-aa19-832fb0425310\r\n

a=ssrc:4051905094 mslabel:1jMfa2Vph7cdloTWnLDiIBh7MVKIesEwpOC3\r\n

a=ssrc:4051905094 label:d3674fe2-2344-43fe-aa19-832fb0425310\r\n

a=ssrc:3634016184 cname:buToKXw9QTcWQHBF\r\n

a=ssrc:3634016184 msid:1jMfa2Vph7cdloTWnLDiIBh7MVKIesEwpOC3 d3674fe2-2344-43fe-aa19-832fb0425310\r\n

a=ssrc:3634016184 mslabel:1jMfa2Vph7cdloTWnLDiIBh7MVKIesEwpOC3\r\n

a=ssrc:3634016184 label:d3674fe2-2344-43fe-aa19-832fb0425310\r\n

answer sdp

v=0\r\n

o=- 0 0 IN IP4 127.0.0.1\r\n

s=MY-PROTOL\r\n

t=0 0\r\n

a=msid-semantic: WMS *\r\n

a=group:BUNDLE audio video\r\n

m=audio 9 UDP/TLS/RTP/SAVPF 111\r\n

c=IN IP4 0.0.0.0\r\n

a=rtpmap:111 opus/48000/2\r\n

a=fmtp:111 minptime=10;useinbandfec=1\r\n

a=rtcp:1 IN IP4 0.0.0.0\r\n

a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\n

a=setup:active\r\n

a=mid:audio\r\n

a=recvonly\r\n

a=ice-ufrag:qctxy\r\n

a=ice-pwd:a123456789b123456789cd\r\n

a=fingerprint:sha-256 A5:5F:18:86:E7:32:5E:11:44:A7:B4:11:E1:18:6C:EE:8B:F6:6D:D6:CA:C7:D2:DF:AC:29:FC:95:09:71:AA:3C\r\n

a=candidate:xxxxxx 1 udp xxxxx x 44572 typ host generation 0\r\n

a=end-of-candidates\r\n

a=rtcp-mux\r\n

m=video 9 UDP/TLS/RTP/SAVPF 101\r\n

c=IN IP4 0.0.0.0\r\n

a=rtpmap:101 H264/90000\r\n

a=fmtp:101 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\n

a=rtcp:1 IN IP4 0.0.0.0\r\n

a=rtcp-fb:101 ccm fir\r\n

a=rtcp-fb:101 nack\r\n

a=rtcp-fb:101 nack pli\r\n

a=rtcp-fb:101 goog-remb\r\n

a=extmap:3 urn:3gpp:video-orientation\r\n

a=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay\r\n

a=extmap:13 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n

a=extmap:14 urn:ietf:params:rtp-hdrext:toffset\r\n

a=setup:active\r\n

a=mid:video\r\n

a=recvonly\r\n

a=ice-ufrag:qctxy\r\n

a=ice-pwd:a123456789b123456789cd\r\n

a=fingerprint:sha-256 A5:5F:18:86:E7:32:5E:11:44:A7:B4:11:E1:18:6C:EE:8B:F6:6D:D6:CA:C7:D2:DF:AC:29:FC:95:09:71:AA:3C\r\n

a=candidate:xxxxxxx 1 udp xxxxxxx x 44572 typ host generation 0\r\n

a=end-of-candidates\r\n

a=rtcp-mux\r\n


舞钢市13317806778: Wireshark流量分析软件解析pcap格式数据包的每条数据流是不是双向传输的? -
向凭德瑞: 不是的.pcap文件中的,或者现场抓包得到的,都是以太网中的网络数据包.是以数据包为单位的.你在wireshark中上面列表中看到的每一行,都是一个以太网数据包.而机器之间的通信,都是需要经过多个数据包的发送与接收,才能完成的.你可以在上面的filter那里设置过滤的协议,将列表中杂乱的数据包过滤一下,仅显示某个协议的数据包,列表中,就都是这个协议及这个协议承载的协议的数据包了.至于双向传输,也需要多个数据包的传输交互理解后,才可以完成,所以每个数据包肯定是单向的.数据流的含义比较模糊,不是很确定,所以不方便回答

舞钢市13317806778: 市场营销作业:简述包装策略的内容,举出使用包装策略成功与失败的两个实例进行分析 -
向凭德瑞: 答复:分为两个方面去分析这个案例? 第一个方面:如何在销售过程中提升优质服务? 作为销售员以真诚和友善来感动客户,来传递对待客户的信任度,以客户中心思想为承诺,以铸就产品的高品质,让客户认同于产品的质量和相关的要求,...

舞钢市13317806778: SDP课程我想问下,关于欧盟教育基金会那个办的sdp课程考的证书对出国留学有用吗?急!!! -
向凭德瑞: 我觉得如果要出国的话,又有机会念,还是念一下的好.据工作人员讲的,应该是一种软实力的认可.我也念过这个课程,自己明显感觉做三次的presentation的过程中有所提高..我不用出国,所以最后的task就没有做,所以就没拿证书..但是我的那些要出国的同学都拿了那个证的(当然也有一二个是没有通过的)..他们觉得反正有好过没有..不管你到最后是选择念或不念,SAT还有雅思的成绩会更重要.如果念得话,那一定要抓紧课堂时间多和外教沟通..

舞钢市13317806778: 51单片机汇编程序详解:POP是干什么的? -
向凭德瑞: POP和PUSH是成对使用的,PUSH是压栈,把数据内容放到堆栈里,POP是弹出栈,把堆栈里的内容取出来. 如果用枪的子弹夹比作堆栈,PUSH,相当于把子弹装进弹夹,POP相当于把子弹从弹夹里打出去

舞钢市13317806778: 供应链管理运营实务与案例分析的介绍 -
向凭德瑞: 本书重点演绎讲解成为一名现代物流职业经理所需的现代供应链运营管理技能与实务,主要内容包括: 供应链管理基础理论及供应链管理在我国的应用背景和发展空间.科学地构建供应链体系、有效地实施供应链管理需要解决的关键问题和实践基础.供应链战略管理运营体系及其支撑技术和利用外部资源进行供应链整合管理的方法.

舞钢市13317806778: 怎么写人力资源管理的案例分析 北电网络 -
向凭德瑞: 1. 案例分析报告一般由两大部分组成:第一部分为案例正文;第二部分为案例分析.重点是案例分析部分的撰写.2. 案例分析报告一般包括以下几个方面的主要内容:标题、摘要、关键词、案例概述、案例分析,其案例分析包括:背景理解、问题诊断与分析、对策与建议、结论.3. 先简述案情及针对本案的几种不同意见;就法条来分析案例,为什么能得出你的结论:写出你对案例的见解,你做此判定的法律依据,就是写出法条; 不赞成其它意见的理由及依据; 做一个总结.

舞钢市13317806778: 人力资源管理案例分析:西门子公司的人力资源开发 -
向凭德瑞: 1.西门子公司培训具有全覆盖、针对性、计划性的特点,而且培训方式形式多样化.有新员工培训、大学精英培训和在职员工培训.培训的内容根据管理学知识和公司业务的需要而制定,涵盖了业务技能、交流能力和管理能力的广泛领域.同时...

舞钢市13317806778: ...(600 - 800字) 21、请查阅相关资料,举例说明“帕累托最优”的涵义以及对政府经济学的意义.(600 - 800字)2、运用“劣币驱逐良币”原理分析我国打击假... -
向凭德瑞:[答案] 帕累托改进是指一种变化,在没有使任何人境况变坏的前提下,使得至少一个人变得更好.而帕累托最优的状态就是不可能再有更多的帕累托改进的余地;换句话说,帕累托改进是达到帕累托最优的路径和方法.一方面,帕累托最优是指没有进行帕...

舞钢市13317806778: 环境影响评价案例分析的介绍 -
向凭德瑞: 《环境影响评价案例分析》是一本教辅书,由中国环境科学出版社出版.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网