国内网站建设费用联盟,专业做企业活动的趴网站,wordpress go链接不跳转,品牌建设的思路前言
在学习SRS的RTC模块之前#xff0c;首先来分析下SRS在将rtmp推流转成rtc流#xff0c;通过浏览器拉取webrtc流场景下产生的SDP内容
SDP格式介绍
SDP数据是文本格式#xff0c;由多个 keyvalue 表达式构成#xff0c;key的值只能是一个字符…前言
在学习SRS的RTC模块之前首先来分析下SRS在将rtmp推流转成rtc流通过浏览器拉取webrtc流场景下产生的SDP内容
SDP格式介绍
SDP数据是文本格式由多个 keyvalue 表达式构成key的值只能是一个字符value是一个字符串。注意等号两边不能有空格
SDP主要由下列描述构成
会话级描述作用于整个会话位置从 v 行开始到第一个媒体描述为止 vsdp协议版本默认为0 例子v0 o发起者或者会话标识 格式ousername session id version network type address type address例子oSRS/4.0.245(Leo) 17778048 2 IN IP4 0.0.0.0说明 username用户名不关心时可用 ‘-’ 代替session id 会话id会话唯一规范建议使用NTP时间戳version会话版本会话数据发生变化时该版本递增规范建议使用NTP时间戳network type网络类型IN表示 Internetaddress type地址类型比如IP4、IP6等address域名或者IP地址 s会话名称每个SDP里面只能有一个且不能为空 例子sSRSPlaySession t, 会话的有效时间 格式tstart time stop time例子t0 0说明 start time/stop time均为NTP时间戳均为0时表示持久会话 b会话或媒体使用的建议带宽 媒体级别描述针对单个媒体流一个会话中可以有多个媒体流位置是从 m 行开始到下一个媒体描述为止 m, 媒体类型和传输地址 格式mmedia type port transport fmt list例子maudio 9 UDP/TLS/RTP/SAVPF 111
mvideo 9 UDP/TLS/RTP/SAVPF 106说明 media type媒体类型比如audio/videoapplication(bfcp)、text等类型port当前媒体类型的数据传输端口在RTC场景下都是通过ICE candidate的信息来进行传输的这个端口不会用到但是在SIP场景下这个port代表RTP端口结合SDP会话级别描述中的C中的ip地址就可以知道在SIP中这路流的传输地址了transport传输协议运行与c中定义的地址类型之上比如IP4就是运行IP4之上的协议fmt代表音视频流的Media Codec会话后面会跟着rtpmap、rtcp-fb、fmtp这些属性来进一步的描述可以有多个值存在多个值的时候表示在这次会话中多种类型都会用到且第一个是默认的。 artpmap描述媒体会话描述(m)中的fmt负载类型对应的编码器名称以及时钟速率信息和编码参数 例子artpmap:111 opus/48000/2 // 对fmt为111的类型进行描述audio codec/sample rate/channel
artpmap:106 H264/90000 // 对fmt为106的类型进行描述video codec/timebaseafmtp扩展字段对媒体会话描述中的指定的fmt进行详细的参数格式指定(这个参数是需要有SDP传输并且透传给使用此格式的媒体工具)每一个fmt只能有一个此描述 格式afmtp:fmt format specific parameters例子afmtp:106 level-asymmetry-allowed1;packetization-mode1;profile-level-id42e01f 说明 fmt媒体会话描述(m)中指定的编码格式format specific parametersfmt对应的透传参数level-asymmetry-allowed1 是否允许两端的编码level不一致必须SDP双方都为1packetization-mode1 NALU打包方式1表示每帧图像被拆分到多个NALU单元传送这些NALU单元传送的顺序是按照解码的顺序发送的profile-level-id42e01f 指定H264的baseline和level等参数 aextmap扩展支持什么协议 例子aextmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01 asendrecv 媒体流的方向既可以在会话描述中也可以在媒体描述中 例子 asendonly //仅发送说明 sendrecv: 双向传输即发送也接收sendonly: 只发送数据revonly: 只接收数据inactive: 禁止发送数据 assrcRTC场景下音视频流和RTP/RTCP复用单一端口通过SSRC区分每一路流通过数据包的头部字段值来区分RTC/RTCP 例子assrc:3459677730 cname:648fef7tl720yj49
assrc:3459677730 label:audio-8804l2a1
assrc:3459677731 cname:648fef7tl720yj49
assrc:3459677731 label:video-7h7733ci说明cname是RTCP为每个RTP用户提供的一个全局唯一的规范名称标识符描述该RTP流对应的RTCP协议中的cname。label对应MediaStreamTrack ID amid当前媒体级别描述的ID相当于给媒体级别描述编号 例子amid:audio //audio就是当前这个媒体级别描述(m)的ID
amid:1 //同理mid后面的值也可以是数字网络描述 c指明接收或者发送音视频使用的IP地址webrtc使用ICE传输这个被忽略 格式cnettype addrtype connection-address例子cIN IP4 0.0.0.0说明可以是会话级别或者是媒体级别如果是媒体级别则每一个媒体级别描述都必须至少包含一个 acandidatecandidate信息传输的候选人有host(主机)类型有replay反射类型等 格式ccandidate:foundation component-id transport priority conn-addr conn-port cand-type candidate-types例子// 传输协议是udp优先级是2130706431
// ip地址是124.221.111.76端口8000candidate的类型是host类型(即ip地址是主机的ip地址)
// 候选者的代数式0表示最初生成的
acandidate:0 1 udp 2130706431 124.221.111.76 8000 typ host generation 0说明candidate信息可以有多个 安全描述 acryptoaice-ufragice short-term认证算法用到的用户名aice-pwd ice short-term认证算法用到的密码afingerprint DTLS过程中的Certificate整数的签名 DTLS角色 asetup 例子asetup:passive说明指定DTLS角色Active客户端Passive服务端两者都可以则是actpass ICE策略 aice-options:trickie 说明trickie说明SDP中没有包含candidate信息candidate是通过信令单独交换的client一边收集candidate一边发送给对端进行连通性检查提高连通性检查和候选捕获的速度 aice-lite ICE的实现分为以下两种 Full ICE: 参与连接的两端都需要进行连通性检查Lite ICE: 在Full ICE和Lite ICE连接时只需要Full ICE一方进行连通性检查Lite一方只需要回应Response消息就行。这种模式常用语公网设备 aice-option:renomination 说明允许 ICE controlling 一方动态重新提名新的 candidate 默认情况 Offer 一方为controlling 角色answer 一方为 controlled 角色同时 Lite 一方只能为 controlled 角色 QOSGrouping传输描述 artcp-fb支持的RTC反馈类型报文媒体级别描述作用域 例子artcp-fb:111 transport-cc // 对于111这个fmt支持transport-cc这个报文
artcp-fb:106 transport-cc // 同理
artcp-fb:106 nack // 对于106这个fmt在ARQ上支持nack
artcp-fb:106 nack pli // 对于106这个fmt在关键帧上支持pli处理注意rtcp-fb不能用于会话级别描述只能用于媒体级别描述而且在m描述的协议字段一定要有AVPF agroup 例子agroup:BUNDLE 0 1说明表示mid值为0和1的媒体会话描述(m)进行复用端口传输 artcp-mux 说明rtcp和rtp复用一个端口号
浏览器创建的本地Offer
通过SRS提供的RTC播放H5页面(http://localhost:8080/players/rtc_player.html?autostarttrue)可以去拉取SRS上的RTC流参考文章SRS调试webrtc流点击页面的播放视频可以看到RTC播放页面请求了一个http接口其中携带H5的local sdp。 local sdp的详细内容如下
v0
o- 4052671107298259095 2 IN IP4 127.0.0.1
s-
t0 0
agroup:BUNDLE 0 1
aextmap-allow-mixed
amsid-semantic: WMS
maudio 9 UDP/TLS/RTP/SAVPF 111 63 9 0 8 13 110 126
cIN IP4 0.0.0.0
artcp:9 IN IP4 0.0.0.0
aice-ufrag:PTFm
aice-pwd:SjhcZkVwk0wlE9AAjAeFrv93
aice-options:trickle
afingerprint:sha-256 55:20:7B:84:80:3C:3A:95:17:C0:BE:0B:3C:23:DB:46:3A:58:29:87:1A:B1:E6:8C:53:9A:27:19:0C:BE:CF:86
asetup:actpass
amid:0
aextmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
aextmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
aextmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
aextmap:4 urn:ietf:params:rtp-hdrext:sdes:mid
arecvonly
artcp-mux
artpmap:111 opus/48000/2
artcp-fb:111 transport-cc
afmtp:111 minptime10;useinbandfec1
artpmap:63 red/48000/2
afmtp:63 111/111
artpmap:9 G722/8000
artpmap:0 PCMU/8000
artpmap:8 PCMA/8000
artpmap:13 CN/8000
artpmap:110 telephone-event/48000
artpmap:126 telephone-event/8000
mvideo 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 35 36 37 38 102 103 104 105 106 107 108 109 127 125 39 40 41 42 43 44 45 46 47 48 112 113 114 115 116 49
cIN IP4 0.0.0.0
artcp:9 IN IP4 0.0.0.0
aice-ufrag:PTFm
aice-pwd:SjhcZkVwk0wlE9AAjAeFrv93
aice-options:trickle
afingerprint:sha-256 55:20:7B:84:80:3C:3A:95:17:C0:BE:0B:3C:23:DB:46:3A:58:29:87:1A:B1:E6:8C:53:9A:27:19:0C:BE:CF:86
asetup:actpass
amid:1
aextmap:14 urn:ietf:params:rtp-hdrext:toffset
aextmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
aextmap:13 urn:3gpp:video-orientation
aextmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
aextmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
aextmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
aextmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
aextmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space
aextmap:4 urn:ietf:params:rtp-hdrext:sdes:mid
aextmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
aextmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
arecvonly
artcp-mux
artcp-rsize
artpmap:96 VP8/90000
artcp-fb:96 goog-remb
artcp-fb:96 transport-cc
artcp-fb:96 ccm fir
artcp-fb:96 nack
artcp-fb:96 nack pli
artpmap:97 rtx/90000
afmtp:97 apt96
artpmap:98 VP9/90000
artcp-fb:98 goog-remb
artcp-fb:98 transport-cc
artcp-fb:98 ccm fir
artcp-fb:98 nack
artcp-fb:98 nack pli
afmtp:98 profile-id0
artpmap:99 rtx/90000
afmtp:99 apt98
artpmap:100 VP9/90000
artcp-fb:100 goog-remb
artcp-fb:100 transport-cc
artcp-fb:100 ccm fir
artcp-fb:100 nack
artcp-fb:100 nack pli
afmtp:100 profile-id2
artpmap:101 rtx/90000
afmtp:101 apt100
artpmap:35 VP9/90000
artcp-fb:35 goog-remb
artcp-fb:35 transport-cc
artcp-fb:35 ccm fir
artcp-fb:35 nack
artcp-fb:35 nack pli
afmtp:35 profile-id1
artpmap:36 rtx/90000
afmtp:36 apt35
artpmap:37 VP9/90000
artcp-fb:37 goog-remb
artcp-fb:37 transport-cc
artcp-fb:37 ccm fir
artcp-fb:37 nack
artcp-fb:37 nack pli
afmtp:37 profile-id3
artpmap:38 rtx/90000
afmtp:38 apt37
artpmap:102 H264/90000
artcp-fb:102 goog-remb
artcp-fb:102 transport-cc
artcp-fb:102 ccm fir
artcp-fb:102 nack
artcp-fb:102 nack pli
afmtp:102 level-asymmetry-allowed1;packetization-mode1;profile-level-id42001f
artpmap:103 rtx/90000
afmtp:103 apt102
artpmap:104 H264/90000
artcp-fb:104 goog-remb
artcp-fb:104 transport-cc
artcp-fb:104 ccm fir
artcp-fb:104 nack
artcp-fb:104 nack pli
afmtp:104 level-asymmetry-allowed1;packetization-mode0;profile-level-id42001f
artpmap:105 rtx/90000
afmtp:105 apt104
artpmap:106 H264/90000
artcp-fb:106 goog-remb
artcp-fb:106 transport-cc
artcp-fb:106 ccm fir
artcp-fb:106 nack
artcp-fb:106 nack pli
afmtp:106 level-asymmetry-allowed1;packetization-mode1;profile-level-id42e01f
artpmap:107 rtx/90000
afmtp:107 apt106
artpmap:108 H264/90000
artcp-fb:108 goog-remb
artcp-fb:108 transport-cc
artcp-fb:108 ccm fir
artcp-fb:108 nack
artcp-fb:108 nack pli
afmtp:108 level-asymmetry-allowed1;packetization-mode0;profile-level-id42e01f
artpmap:109 rtx/90000
afmtp:109 apt108
artpmap:127 H264/90000
artcp-fb:127 goog-remb
artcp-fb:127 transport-cc
artcp-fb:127 ccm fir
artcp-fb:127 nack
artcp-fb:127 nack pli
afmtp:127 level-asymmetry-allowed1;packetization-mode1;profile-level-id4d001f
artpmap:125 rtx/90000
afmtp:125 apt127
artpmap:39 H264/90000
artcp-fb:39 goog-remb
artcp-fb:39 transport-cc
artcp-fb:39 ccm fir
artcp-fb:39 nack
artcp-fb:39 nack pli
afmtp:39 level-asymmetry-allowed1;packetization-mode0;profile-level-id4d001f
artpmap:40 rtx/90000
afmtp:40 apt39
artpmap:41 H264/90000
artcp-fb:41 goog-remb
artcp-fb:41 transport-cc
artcp-fb:41 ccm fir
artcp-fb:41 nack
artcp-fb:41 nack pli
afmtp:41 level-asymmetry-allowed1;packetization-mode1;profile-level-idf4001f
artpmap:42 rtx/90000
afmtp:42 apt41
artpmap:43 H264/90000
artcp-fb:43 goog-remb
artcp-fb:43 transport-cc
artcp-fb:43 ccm fir
artcp-fb:43 nack
artcp-fb:43 nack pli
afmtp:43 level-asymmetry-allowed1;packetization-mode0;profile-level-idf4001f
artpmap:44 rtx/90000
afmtp:44 apt43
artpmap:45 AV1/90000
artcp-fb:45 goog-remb
artcp-fb:45 transport-cc
artcp-fb:45 ccm fir
artcp-fb:45 nack
artcp-fb:45 nack pli
artpmap:46 rtx/90000
afmtp:46 apt45
artpmap:47 AV1/90000
artcp-fb:47 goog-remb
artcp-fb:47 transport-cc
artcp-fb:47 ccm fir
artcp-fb:47 nack
artcp-fb:47 nack pli
afmtp:47 profile1
artpmap:48 rtx/90000
afmtp:48 apt47
artpmap:112 H264/90000
artcp-fb:112 goog-remb
artcp-fb:112 transport-cc
artcp-fb:112 ccm fir
artcp-fb:112 nack
artcp-fb:112 nack pli
afmtp:112 level-asymmetry-allowed1;packetization-mode1;profile-level-id64001f
artpmap:113 rtx/90000
afmtp:113 apt112
artpmap:114 red/90000
artpmap:115 rtx/90000
afmtp:115 apt114
artpmap:116 ulpfec/90000
artpmap:49 flexfec-03/90000
artcp-fb:49 goog-remb
artcp-fb:49 transport-cc
afmtp:49 repair-window10000000SRS返回的远端Answer
SRS在srs_app_rtc_api.cpp文件中的SrsGoApiRtcPlay类中处理offer请求返回内容如下 远端Answer内容如下
v0 // 会话级描述SDP协议版本固定为0
oSRS/4.0.245(Leo) 17778048 2 IN IP4 0.0.0.0 // 会话级描述
sSRSPlaySession
t0 0
aice-lite
agroup:BUNDLE 0 1
amsid-semantic: WMS live/livestream
maudio 9 UDP/TLS/RTP/SAVPF 111
cIN IP4 0.0.0.0
aice-ufrag:j0w47g4z
aice-pwd:879b5n40s824s1985h3z60s77a8132v1
afingerprint:sha-256 A8:83:2B:5D:FF:E2:5A:14:6C:0A:24:A0:11:C3:01:8A:4A:8E:AF:3F:AC:B6:67:EE:3C:4B:47:07:7E:7B:D9:6F
asetup:passive
amid:0
aextmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
asendonly
artcp-mux
artcp-rsize
artpmap:111 opus/48000/2
artcp-fb:111 transport-cc
assrc:3459677730 cname:648fef7tl720yj49
assrc:3459677730 label:audio-8804l2a1
acandidate:0 1 udp 2130706431 124.221.111.76 8000 typ host generation 0
mvideo 9 UDP/TLS/RTP/SAVPF 106
cIN IP4 0.0.0.0
aice-ufrag:j0w47g4z
aice-pwd:879b5n40s824s1985h3z60s77a8132v1
afingerprint:sha-256 A8:83:2B:5D:FF:E2:5A:14:6C:0A:24:A0:11:C3:01:8A:4A:8E:AF:3F:AC:B6:67:EE:3C:4B:47:07:7E:7B:D9:6F
asetup:passive
amid:1
aextmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
asendonly
artcp-mux
artcp-rsize
artpmap:106 H264/90000
artcp-fb:106 transport-cc
artcp-fb:106 nack
artcp-fb:106 nack pli
afmtp:106 level-asymmetry-allowed1;packetization-mode1;profile-level-id42e01f
assrc:3459677731 cname:648fef7tl720yj49
assrc:3459677731 label:video-7h7733ci
acandidate:0 1 udp 2130706431 124.221.111.76 8000 typ host generation 0 总结
对比本地和远端SDP发现浏览器提供的特性非常多SRS提供的较少SRS是Lite ICE客户端无需进行连通性检测。
参考文档 https://blog.csdn.net/aggresss/article/details/109850434 https://www.livevideostack.cn/news/webrtc-sdp-details-and-analysis/ https://blog.csdn.net/zqxf123456789/article/details/109696266 RFC4566 从0打造音视频直播系统李超