首页 » 软件开发 » SDP协议讲解?有什么用?(会话描述编码音频传输)

SDP协议讲解?有什么用?(会话描述编码音频传输)

少女玫瑰心 2024-07-23 23:02:16 0

扫一扫用手机浏览

文章目录 [+]

v=0 o=- 3409821183230872764 2 IN IP4 127.0.0.1 ... m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 110 112 113 126 ...a=rtpmap:111 opus/48000/2 a=rtpmap:103 ISAC/16000 a=rtpmap:104 ISAC/32000 ...

如上面的 SDP 片段所示,该 SDP 中描述了一路音频流,即m=audio,该音频支持的 Payload ( 即数据负载 ) 类型包括 111、103、104 等等。
在该 SDP 片段中又进一步对 111、103、104 等 Payload 类型做了更详细的描述,如 a=rtpmap:111 opus/48000/2 表示 Payload 类型为 111 的数据是 OPUS 编码的音频数 据,并且它的采样率是 48000,使用双声道。
以此类推,你也就可以知道 a=rtpmap:104 ISAC/32000 的含义是音频数据使用 ISAC 编码,采样频率是 32000,使用单声道。

二、SDP 作用

前面的章节rtsp实验我们用到的sdp描述服务端和客服端通信的端口等信息。
这里先拓展说一些webrtc中用到的sdp。

webrtc两个客户端 / 浏览器进行 1 对 1 通话时,首先要进行信令交互,而交互的一 个重要信息就是 SDP 的交换。
交换 SDP 的目的是为了让对方知道彼此具有哪些能力,然后根据双方各自的能力进行协 商,协商出大家认可的音视频编解码器、编解码器相关的参数(如音频通道数,采样率 等)、传输协议等信息。
举个例子,A 与 B 进行通讯,它们先各自在 SDP 中记录自己支持的音频参数、视频参数、 传输协议等信息,然后再将自己的 SDP 信息通过信令服务器发送给对方。
当一方收到对端 传来的 SDP 信息后,它会将接收到的 SDP 与自己的 SDP 进行比较,并取出它们之间的交 集,这个交集就是它们协商的结果,也就是它们最终使用的音视频参数及传输协议了。

SDP协议讲解?有什么用?(会话描述编码音频传输) 软件开发
(图片来自网络侵删)
三、标准 SDP 规范

sdp信息由多行"="组成,其中是一个字符串,是一个字符串,type表示类型,value的格式视type而定,整个协议区分大小写,"="两侧不允许有空格!
sdp会话描述包含一个会话级描述(session_level_description)和多个媒体级描述(media_level description)组成!
会话级描述的作用域是整个会话,其位置从"v="行开始到第一个媒体描述为止;媒体级描述是对单个的媒体流进行描述,如传输过程中的视频流信息,从m=开始到下一个媒体描述为止,如下图所示:

会话级描述主要包含以下字段:

v = ( 表示sdp的版本号,不包含次版本号)

o = (所有者/创建者和会话标识符)

s = (Session Name会话名称)

i = (会话信息)

u = (URI 描述)

e = (Email 地址)

p = (电话号码)

c = (连接信息 ― 如果包含在所有媒体中,则不需要该字段)

b = (带宽信息)

时间描述

t = (会话活动时间)

r = (0或多次重复次数)

媒体级描述主要包含以下字段:

m = (媒体名称和传输地址)

i = (媒体标题)

c = (连接信息 — 如果包含在会话层则该字段可选)

b = (带宽信息)

k = (加密密钥)

a = (0 个或多个会话属性行)

领取音视频开发学习资料:音视频开发(资料文档+视频教程+面试题)(FFmpeg+WebRTC+RTMP+RTSP+HLS+RTP)

SDP例子:

webrtc的例子(基于标准SDP做了修改扩展)

v=0//sdp版本号,一直为0,rfc4566规定o=- 7017624586836067756 2 IN IP4 127.0.0.1// o=<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address>//username如何没有使用-代替,7017624586836067756是整个会话的编号,2代表会话版本,如果在会话//过程中有改变编码之类的操作,重新生成sdp时,sess-id不变,sess-version加1s=-//会话名,没有的话使用-代替t=0 0//两个值分别是会话的起始时间和结束时间,这里都是0代表没有限制a=group:BUNDLE audio video data//需要共用一个传输通道传输的媒体,如果没有这一行,音视频,数据就会分别单独用一个udp端口来发送a=msid-semantic: WMS h1aZ20mbQB0GSsq0YxLfJmiYWE9CBfGch97C//WMS是WebRTC Media Stream简称,这一行定义了本客户端支持同时传输多个流,一个流可以包括多个track,//一般定义了这个,后面a=ssrc这一行就会有msid,mslabel等属性m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126//m=audio说明本会话包含音频,9代表音频使用端口9来传输,但是在webrtc中一现在一般不使用,如果设置为0,代表不//传输音频,UDP/TLS/RTP/SAVPF是表示用户来传输音频支持的协议,udp,tls,rtp代表使用udp来传输rtp包,并使用tls加密//SAVPF代表使用srtcp的反馈机制来控制通信过程,后台111 103 104 9 0 8 106 105 13 126表示本会话音频支持的编码,后台几行会有详细补充说明c=IN IP4 0.0.0.0//这一行表示你要用来接收或者发送音频使用的IP地址,webrtc使用ice传输,不使用这个地址a=rtcp:9 IN IP4 0.0.0.0//用来传输rtcp地地址和端口,webrtc中不使用a=ice-ufrag:khLSa=ice-pwd:cxLzteJaJBou3DspNaPsJhlQ//以上两行是ice协商过程中的安全验证信息a=fingerprint:sha-256 FA:14:42:3B:C7:97:1B:E8:AE:0C2:71:03:05:05:16:8F:B9:C7:98:E9:60:43:4B:5B:2C:28:EE:5C:8F3:17//以上这行是dtls协商过程中需要的认证信息a=setup:actpass//以上这行代表本客户端在dtls协商过程中,可以做客户端也可以做服务端,参考rfc4145 rfc4572a=mid:audio//在前面BUNDLE这一行中用到的媒体标识a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level//上一行指出我要在rtp头部中加入音量信息,参考 rfc6464a=sendrecv//上一行指出我是双向通信,另外几种类型是recvonly,sendonly,inactivea=rtcp-mux//上一行指出rtp,rtcp包使用同一个端口来传输//下面几行都是对m=audio这一行的媒体编码补充说明,指出了编码采用的编号,采样率,声道等a=rtpmap:111 opus/48000/2a=rtcp-fb:111 transport-cc//以上这行说明opus编码支持使用rtcp来控制拥塞,参考https://tools.ietf.org/html/draft-holmer-rmcat-transport-wide-cc-extensions-01a=fmtp:111 minptime=10;useinbandfec=1//对opus编码可选的补充说明,minptime代表最小打包时长是10ms,useinbandfec=1代表使用opus编码内置fec特性a=rtpmap:103 ISAC/16000a=rtpmap:104 ISAC/32000a=rtpmap:9 G722/8000a=rtpmap:0 PCMU/8000a=rtpmap:8 PCMA/8000a=rtpmap:106 CN/32000a=rtpmap:105 CN/16000a=rtpmap:13 CN/8000a=rtpmap:126 telephone-event/8000a=ssrc:18509423 cname:sTjtznXLCNH7nbRw//cname用来标识一个数据源,ssrc当发生冲突时可能会发生变化,但是cname不会发生变化,也会出现在rtcp包中SDEC中,//用于音视频同步a=ssrc:18509423 msid:h1aZ20mbQB0GSsq0YxLfJmiYWE9CBfGch97C 15598a91-caf9-4fff-a28f-3082310b2b7a//以上这一行定义了ssrc和WebRTC中的MediaStream,AudioTrack之间的关系,msid后面第一个属性是stream-d,第二个是track-ida=ssrc:18509423 mslabel:h1aZ20mbQB0GSsq0YxLfJmiYWE9CBfGch97Ca=ssrc:18509423 label:15598a91-caf9-4fff-a28f-3082310b2b7am=video 9 UDP/TLS/RTP/SAVPF 100 101 107 116 117 96 97 99 98//参考上面m=audio,含义类似c=IN IP4 0.0.0.0a=rtcp:9 IN IP4 0.0.0.0a=ice-ufrag:khLSa=ice-pwd:cxLzteJaJBou3DspNaPsJhlQa=fingerprint:sha-256 FA:14:42:3B:C7:97:1B:E8:AE:0C2:71:03:05:05:16:8F:B9:C7:98:E9:60:43:4B:5B:2C:28:EE:5C:8F3:17a=setup:actpassa=mid:videoa=extmap:2 urn:ietf:params:rtp-hdrext:toffseta=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-timea=extmap:4 urn:3gpp:video-orientationa=extmap:5 http://www.ietf.org/id/draft-hol ... de-cc-extensions-01a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/playout-delaya=sendrecva=rtcp-muxa=rtcp-rsizea=rtpmap:100 VP8/90000a=rtcp-fb:100 ccm fir//ccm是codec control using RTCP feedback message简称,意思是支持使用rtcp反馈机制来实现编码控制,fir是Full Intra Request//简称,意思是接收方通知发送方发送幅完全帧过来a=rtcp-fb:100 nack//支持丢包重传,参考rfc4585a=rtcp-fb:100 nack pli//支持关键帧丢包重传,参考rfc4585a=rtcp-fb:100 goog-remb//支持使用rtcp包来控制发送方的码流a=rtcp-fb:100 transport-cc//参考上面opusa=rtpmap:101 VP9/90000a=rtcp-fb:101 ccm fira=rtcp-fb:101 nacka=rtcp-fb:101 nack plia=rtcp-fb:101 goog-remba=rtcp-fb:101 transport-cca=rtpmap:107 H264/90000a=rtcp-fb:107 ccm fira=rtcp-fb:107 nacka=rtcp-fb:107 nack plia=rtcp-fb:107 goog-remba=rtcp-fb:107 transport-cca=fmtp:107 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f//h264编码可选的附加说明a=rtpmap:116 red/90000//fec冗余编码,一般如果sdp中有这一行的话,rtp头部负载类型就是116,否则就是各编码原生负责类型a=rtpmap:117 ulpfec/90000//支持ULP FEC,参考rfc5109a=rtpmap:96 rtx/90000a=fmtp:96 apt=100//以上两行是VP8编码的重传包rtp类型a=rtpmap:97 rtx/90000a=fmtp:97 apt=101a=rtpmap:99 rtx/90000a=fmtp:99 apt=107a=rtpmap:98 rtx/90000a=fmtp:98 apt=116a=ssrc-group:FID 3463951252 1461041037//在webrtc中,重传包和正常包ssrc是不同的,上一行中前一个是正常rtp包的ssrc,后一个是重传包的ssrca=ssrc:3463951252 cname:sTjtznXLCNH7nbRwa=ssrc:3463951252 msid:h1aZ20mbQB0GSsq0YxLfJmiYWE9CBfGch97C ead4b4e9-b650-4ed5-86f8-6f5f5806346da=ssrc:3463951252 mslabel:h1aZ20mbQB0GSsq0YxLfJmiYWE9CBfGch97Ca=ssrc:3463951252 label:ead4b4e9-b650-4ed5-86f8-6f5f5806346da=ssrc:1461041037 cname:sTjtznXLCNH7nbRwa=ssrc:1461041037 msid:h1aZ20mbQB0GSsq0YxLfJmiYWE9CBfGch97C ead4b4e9-b650-4ed5-86f8-6f5f5806346da=ssrc:1461041037 mslabel:h1aZ20mbQB0GSsq0YxLfJmiYWE9CBfGch97Ca=ssrc:1461041037 label:ead4b4e9-b650-4ed5-86f8-6f5f5806346dm=application 9 DTLS/SCTP 5000c=IN IP4 0.0.0.0a=ice-ufrag:khLSa=ice-pwd:cxLzteJaJBou3DspNaPsJhlQa=fingerprint:sha-256 FA:14:42:3B:C7:97:1B:E8:AE:0C2:71:03:05:05:16:8F:B9:C7:98:E9:60:43:4B:5B:2C:28:EE:5C:8F3:17a=setup:actpassa=mid:dataa=sctpmap:5000 webrtc-datachannel 1024

RTSP推流例子

v=0o=- 1586545639954157 1586545639954157 IN IP4 192.168.1.63s=Media Presentatione=NONEb=AS:5100t=0 0a=control:rtsp://192.168.1.63:554/m=video 0 RTP/AVP 96c=IN IP4 0.0.0.0b=AS:5000a=recvonlya=x-dimensions:1920,1080a=control:rtsp://192.168.1.63:554/trackID=1a=rtpmap:96 H264/90000a=fmtp:96 profile-level-id=420029; packetization-mode=1; sprop-parameter-sets=Z01AKI2NQDwBE/LgLcBAQFAAAD6AAAw1DoYACYFAABfXgu8uNDAATAoAAL68F3lwoA==,aO44gA==m=audio 0 RTP/AVP 8c=IN IP4 0.0.0.0b=AS:50a=recvonlya=control:rtsp://192.168.1.63:554/trackID=2a=rtpmap:8 PCMA/8000a=Media_header:MEDIAINFO=494D4B48010300000400000111710110401F000000FA000000000000000000000000000000000000;a=appversion:1.0v=0o=34020000001320000010 0 0 IN IP4 192.168.1.202s=Playc=IN IP4 192.168.1.202t=0 0m=video 5500 RTP/AVP 96 97 98a=rtpmap:96 PS/90000a=rtpmap:97 MPEG4/90000a=rtpmap:98 H264/90000a=recvonly

标签:

相关文章

VB语言工具,助力软件开发新篇章

随着科技的发展,编程语言在软件开发中扮演着越来越重要的角色。VB语言工具作为其中的一员,凭借其易学易用、功能强大等特点,受到了广大...

软件开发 2024-12-29 阅读0 评论0

R语言数独包,介绍数独游戏的编程魅力

数独作为一种益智游戏,深受广大游戏爱好者的喜爱。在我国,数独已经成为了许多人茶余饭后的消遣方式。对于编程爱好者来说,如何运用编程技...

软件开发 2024-12-29 阅读0 评论0

洞头IT培训,助力未来科技人才崛起的摇篮

随着科技的飞速发展,信息技术(IT)行业已成为推动社会进步的重要力量。在这个时代背景下,培养具备扎实IT技能的人才显得尤为重要。洞...

软件开发 2024-12-29 阅读1 评论0

时间有限,IT如何助力企业高效发展

在当今这个瞬息万变的时代,企业面临着前所未有的挑战。如何在有限的时间内实现高效发展,成为众多企业家关注的焦点。IT作为现代企业发展...

软件开发 2024-12-29 阅读1 评论0

C语言中的转义字符,介绍编程中的神秘符号

在C语言的世界里,有一种神秘的符号,它们看似普通,却蕴含着丰富的内涵。这些符号就是C语言中的转义字符。本文将带您走进C语言的转义字...

软件开发 2024-12-29 阅读0 评论0

R语言下标的魅力,数据处理的得力助手

随着大数据时代的到来,数据分析与处理在各个领域都发挥着越来越重要的作用。R语言作为一款强大的统计软件,因其丰富的功能、灵活的语法和...

软件开发 2024-12-29 阅读1 评论0