SRS源码分析-SDP内容解析
前言
在学习SRS的RTC模块之前,首先来分析下SRS在将rtmp推流转成rtc流,通过浏览器拉取webrtc流场景下产生的SDP内容
SDP格式介绍
SDP数据是文本格式,由多个 <key>=<value> 表达式构成,<key>的值只能是一个字符,<value>是一个字符串。注意:等号两边不能有空格
SDP主要由下列描述构成
- 会话级描述(作用于整个会话),位置从 v= 行开始到第一个媒体描述为止
- v=,sdp协议版本,默认为0
- 例子:
v=0
- 例子:
- o=,发起者或者会话标识
- 格式:
o=<username> <session id> <version> <network type> <address type> <address> - 例子:
o=SRS/4.0.245(Leo) 17778048 2 IN IP4 0.0.0.0 - 说明:
- username:用户名,不关心时,可用 ‘-’ 代替
- session id: 会话id,会话唯一,规范建议使用NTP时间戳
- version:会话版本,会话数据发生变化时该版本递增,规范建议使用NTP时间戳
- network type:网络类型,IN表示 Internet
- address type:地址类型,比如IP4、IP6等
- address:域名或者IP地址
- 格式:
- s=,会话名称,每个SDP里面只能有一个,且不能为空
- 例子:
s=SRSPlaySession
- 例子:
- t=, 会话的有效时间
- 格式:
t=<start time> <stop time> - 例子:
t=0 0 - 说明:
- start time/stop time均为NTP时间戳,均为0时,表示持久会话
- 格式:
- b=,会话或媒体使用的建议带宽
- v=,sdp协议版本,默认为0
- 媒体级别描述(针对单个媒体流,一个会话中可以有多个媒体流),位置是从 m= 行开始到下一个媒体描述为止
- m=, 媒体类型和传输地址
- 格式:
m=<media type> <port> <transport> <fmt list> - 例子:
m=audio 9 UDP/TLS/RTP/SAVPF 111 m=video 9 UDP/TLS/RTP/SAVPF 106 - 说明:
- media type:媒体类型,比如audio/video,application(bfcp)、text等类型
- port:当前媒体类型的数据传输端口,在RTC场景下都是通过ICE candidate的信息来进行传输的,这个端口不会用到,但是在SIP场景下,这个port代表RTP端口,结合SDP会话级别描述中的C=中的ip地址,就可以知道在SIP中这路流的传输地址了
- transport:传输协议,运行与c=中定义的地址类型之上,比如IP4,就是运行IP4之上的协议
- fmt:代表音视频流的Media Codec,会话后面会跟着rtpmap、rtcp-fb、fmtp这些属性来进一步的描述,可以有多个值,存在多个值的时候,表示在这次会话中,多种类型都会用到,且第一个是默认的。
- 格式:
- a=rtpmap,描述媒体会话描述(m=)中的fmt负载类型对应的编码器名称以及时钟速率信息和编码参数
- 例子:
a=rtpmap:111 opus/48000/2 // 对fmt为111的类型进行描述,audio codec/sample rate/channel a=rtpmap:106 H264/90000 // 对fmt为106的类型进行描述,video codec/timebase
- 例子:
- a=fmtp,扩展字段,对媒体会话描述中的指定的fmt进行详细的参数格式指定(这个参数是需要有SDP传输,并且透传给使用此格式的媒体工具),每一个fmt只能有一个此描述
- 格式:
a=fmtp:<fmt> <format specific parameters> - 例子:
a=fmtp:106 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f - 说明:
- fmt:媒体会话描述(m=)中指定的编码格式
- format specific parameters:fmt对应的透传参数
- level-asymmetry-allowed=1 => 是否允许两端的编码level不一致,必须SDP双方都为1
- packetization-mode=1 => NALU打包方式,1表示,每帧图像被拆分到多个NALU单元传送,这些NALU单元传送的顺序是按照解码的顺序发送的
- profile-level-id=42e01f => 指定H264的baseline和level等参数
- 格式:
- a=extmap,扩展,支持什么协议
- 例子:
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
- 例子:
- a=sendrecv 媒体流的方向,既可以在会话描述中,也可以在媒体描述中
- 例子:
a=sendonly //仅发送 - 说明:
- sendrecv: 双向传输,即发送也接收
- sendonly: 只发送数据
- revonly: 只接收数据
- inactive: 禁止发送数据
- 例子:
- a=ssrc,RTC场景下音视频流和RTP/RTCP复用单一端口,通过SSRC区分每一路流,通过数据包的头部字段值来区分RTC/RTCP
- 例子:
a=ssrc:3459677730 cname:648fef7tl720yj49 a=ssrc:3459677730 label:audio-8804l2a1 a=ssrc:3459677731 cname:648fef7tl720yj49 a=ssrc:3459677731 label:video-7h7733ci - 说明:cname是RTCP为每个RTP用户提供的一个全局唯一的规范名称标识符,描述该RTP流对应的RTCP协议中的cname。
- label对应MediaStreamTrack ID
- 例子:
- a=mid,当前媒体级别描述的ID,相当于给媒体级别描述编号
- 例子:
a=mid:audio //audio就是当前这个媒体级别描述(m=)的ID a=mid:1 //同理,mid后面的值也可以是数字
- 例子:
- m=, 媒体类型和传输地址
- 网络描述
- c=,指明接收或者发送音视频使用的IP地址,webrtc使用ICE传输,这个被忽略
- 格式:
c=<nettype> <addrtype> <connection-address> - 例子:
c=IN IP4 0.0.0.0 - 说明:可以是会话级别或者是媒体级别,如果是媒体级别则每一个媒体级别描述都必须至少包含一个
- 格式:
- a=candidate,candidate信息,传输的候选人,有host(主机)类型,有replay(反射)类型等
- 格式:
c=candidate:<foundation> <component-id> <transport> <priority> <conn-addr> <conn-port> <cand-type> <candidate-types> - 例子:
// 传输协议是udp,优先级是2130706431 // ip地址是124.221.111.76,端口8000,candidate的类型是host类型(即ip地址是主机的ip地址) // 候选者的代数式0,表示最初生成的 a=candidate:0 1 udp 2130706431 124.221.111.76 8000 typ host generation 0 - 说明:candidate信息可以有多个
- 格式:
- c=,指明接收或者发送音视频使用的IP地址,webrtc使用ICE传输,这个被忽略
- 安全描述
- a=crypto
- a=ice-ufrag,ice short-term认证算法用到的用户名
- a=ice-pwd, ice short-term认证算法用到的密码
- a=fingerprint DTLS过程中的Certificate整数的签名
- DTLS角色
- a=setup
- 例子:
a=setup:passive - 说明:指定DTLS角色,Active:客户端,Passive:服务端,两者都可以则是actpass
- 例子:
- a=setup
- ICE策略
- a=ice-options:trickie
- 说明:trickie说明SDP中没有包含candidate信息,candidate是通过信令单独交换的,client一边收集candidate,一边发送给对端进行连通性检查,提高连通性检查和候选捕获的速度
- a=ice-lite
- ICE的实现分为以下两种
- Full ICE: 参与连接的两端都需要进行连通性检查
- Lite ICE: 在Full ICE和Lite ICE连接时,只需要Full ICE一方进行连通性检查,Lite一方只需要回应Response消息就行。这种模式常用语公网设备
- ICE的实现分为以下两种
- a=ice-option:renomination
- 说明:允许 ICE controlling 一方动态重新提名新的 candidate ,默认情况 Offer 一方为controlling 角色,answer 一方为 controlled 角色;同时 Lite 一方只能为 controlled 角色
- a=ice-options:trickie
- QOS,Grouping传输描述
- a=rtcp-fb,支持的RTC反馈类型报文,媒体级别描述作用域
- 例子:
a=rtcp-fb:111 transport-cc // 对于111这个fmt支持transport-cc这个报文 a=rtcp-fb:106 transport-cc // 同理 a=rtcp-fb:106 nack // 对于106这个fmt在ARQ上支持nack a=rtcp-fb:106 nack pli // 对于106这个fmt在关键帧上支持pli处理 - 注意:rtcp-fb不能用于会话级别描述,只能用于媒体级别描述,而且在m=描述的协议字段一定要有AVPF
- 例子:
- a=group
- 例子:
a=group:BUNDLE 0 1 - 说明:表示mid值为0和1的媒体会话描述(m=)进行复用端口传输
- 例子:
- a=rtcp-mux
- 说明:rtcp和rtp复用一个端口号
- a=rtcp-fb,支持的RTC反馈类型报文,媒体级别描述作用域
浏览器创建的本地Offer
通过SRS提供的RTC播放H5页面(http://localhost:8080/players/rtc_player.html?autostart=true)可以去拉取SRS上的RTC流(参考文章:SRS调试webrtc流),点击页面的播放视频,可以看到RTC播放页面请求了一个http接口,其中携带H5的local sdp。

local sdp的详细内容如下:
v=0
o=- 4052671107298259095 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE 0 1
a=extmap-allow-mixed
a=msid-semantic: WMS
m=audio 9 UDP/TLS/RTP/SAVPF 111 63 9 0 8 13 110 126
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:PTFm
a=ice-pwd:SjhcZkVwk0wlE9AAjAeFrv93
a=ice-options:trickle
a=fingerprint: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
a=setup:actpass
a=mid:0
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid
a=recvonly
a=rtcp-mux
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1
a=rtpmap:63 red/48000/2
a=fmtp:63 111/111
a=rtpmap:9 G722/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:13 CN/8000
a=rtpmap:110 telephone-event/48000
a=rtpmap:126 telephone-event/8000
m=video 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
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:PTFm
a=ice-pwd:SjhcZkVwk0wlE9AAjAeFrv93
a=ice-options:trickle
a=fingerprint: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
a=setup:actpass
a=mid:1
a=extmap:14 urn:ietf:params:rtp-hdrext:toffset
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:13 urn:3gpp:video-orientation
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space
a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
a=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
a=recvonly
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=rtpmap:98 VP9/90000
a=rtcp-fb:98 goog-remb
a=rtcp-fb:98 transport-cc
a=rtcp-fb:98 ccm fir
a=rtcp-fb:98 nack
a=rtcp-fb:98 nack pli
a=fmtp:98 profile-id=0
a=rtpmap:99 rtx/90000
a=fmtp:99 apt=98
a=rtpmap:100 VP9/90000
a=rtcp-fb:100 goog-remb
a=rtcp-fb:100 transport-cc
a=rtcp-fb:100 ccm fir
a=rtcp-fb:100 nack
a=rtcp-fb:100 nack pli
a=fmtp:100 profile-id=2
a=rtpmap:101 rtx/90000
a=fmtp:101 apt=100
a=rtpmap:35 VP9/90000
a=rtcp-fb:35 goog-remb
a=rtcp-fb:35 transport-cc
a=rtcp-fb:35 ccm fir
a=rtcp-fb:35 nack
a=rtcp-fb:35 nack pli
a=fmtp:35 profile-id=1
a=rtpmap:36 rtx/90000
a=fmtp:36 apt=35
a=rtpmap:37 VP9/90000
a=rtcp-fb:37 goog-remb
a=rtcp-fb:37 transport-cc
a=rtcp-fb:37 ccm fir
a=rtcp-fb:37 nack
a=rtcp-fb:37 nack pli
a=fmtp:37 profile-id=3
a=rtpmap:38 rtx/90000
a=fmtp:38 apt=37
a=rtpmap:102 H264/90000
a=rtcp-fb:102 goog-remb
a=rtcp-fb:102 transport-cc
a=rtcp-fb:102 ccm fir
a=rtcp-fb:102 nack
a=rtcp-fb:102 nack pli
a=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f
a=rtpmap:103 rtx/90000
a=fmtp:103 apt=102
a=rtpmap:104 H264/90000
a=rtcp-fb:104 goog-remb
a=rtcp-fb:104 transport-cc
a=rtcp-fb:104 ccm fir
a=rtcp-fb:104 nack
a=rtcp-fb:104 nack pli
a=fmtp:104 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f
a=rtpmap:105 rtx/90000
a=fmtp:105 apt=104
a=rtpmap:106 H264/90000
a=rtcp-fb:106 goog-remb
a=rtcp-fb:106 transport-cc
a=rtcp-fb:106 ccm fir
a=rtcp-fb:106 nack
a=rtcp-fb:106 nack pli
a=fmtp:106 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=rtpmap:107 rtx/90000
a=fmtp:107 apt=106
a=rtpmap:108 H264/90000
a=rtcp-fb:108 goog-remb
a=rtcp-fb:108 transport-cc
a=rtcp-fb:108 ccm fir
a=rtcp-fb:108 nack
a=rtcp-fb:108 nack pli
a=fmtp:108 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f
a=rtpmap:109 rtx/90000
a=fmtp:109 apt=108
a=rtpmap:127 H264/90000
a=rtcp-fb:127 goog-remb
a=rtcp-fb:127 transport-cc
a=rtcp-fb:127 ccm fir
a=rtcp-fb:127 nack
a=rtcp-fb:127 nack pli
a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=4d001f
a=rtpmap:125 rtx/90000
a=fmtp:125 apt=127
a=rtpmap:39 H264/90000
a=rtcp-fb:39 goog-remb
a=rtcp-fb:39 transport-cc
a=rtcp-fb:39 ccm fir
a=rtcp-fb:39 nack
a=rtcp-fb:39 nack pli
a=fmtp:39 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=4d001f
a=rtpmap:40 rtx/90000
a=fmtp:40 apt=39
a=rtpmap:41 H264/90000
a=rtcp-fb:41 goog-remb
a=rtcp-fb:41 transport-cc
a=rtcp-fb:41 ccm fir
a=rtcp-fb:41 nack
a=rtcp-fb:41 nack pli
a=fmtp:41 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=f4001f
a=rtpmap:42 rtx/90000
a=fmtp:42 apt=41
a=rtpmap:43 H264/90000
a=rtcp-fb:43 goog-remb
a=rtcp-fb:43 transport-cc
a=rtcp-fb:43 ccm fir
a=rtcp-fb:43 nack
a=rtcp-fb:43 nack pli
a=fmtp:43 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=f4001f
a=rtpmap:44 rtx/90000
a=fmtp:44 apt=43
a=rtpmap:45 AV1/90000
a=rtcp-fb:45 goog-remb
a=rtcp-fb:45 transport-cc
a=rtcp-fb:45 ccm fir
a=rtcp-fb:45 nack
a=rtcp-fb:45 nack pli
a=rtpmap:46 rtx/90000
a=fmtp:46 apt=45
a=rtpmap:47 AV1/90000
a=rtcp-fb:47 goog-remb
a=rtcp-fb:47 transport-cc
a=rtcp-fb:47 ccm fir
a=rtcp-fb:47 nack
a=rtcp-fb:47 nack pli
a=fmtp:47 profile=1
a=rtpmap:48 rtx/90000
a=fmtp:48 apt=47
a=rtpmap:112 H264/90000
a=rtcp-fb:112 goog-remb
a=rtcp-fb:112 transport-cc
a=rtcp-fb:112 ccm fir
a=rtcp-fb:112 nack
a=rtcp-fb:112 nack pli
a=fmtp:112 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=64001f
a=rtpmap:113 rtx/90000
a=fmtp:113 apt=112
a=rtpmap:114 red/90000
a=rtpmap:115 rtx/90000
a=fmtp:115 apt=114
a=rtpmap:116 ulpfec/90000
a=rtpmap:49 flexfec-03/90000
a=rtcp-fb:49 goog-remb
a=rtcp-fb:49 transport-cc
a=fmtp:49 repair-window=10000000
SRS返回的远端Answer
SRS在srs_app_rtc_api.cpp文件中的SrsGoApiRtcPlay类中处理offer请求,返回内容如下

远端Answer内容如下:
v=0 // 会话级描述:SDP协议版本,固定为0
o=SRS/4.0.245(Leo) 17778048 2 IN IP4 0.0.0.0 // 会话级描述
s=SRSPlaySession
t=0 0
a=ice-lite
a=group:BUNDLE 0 1
a=msid-semantic: WMS live/livestream
m=audio 9 UDP/TLS/RTP/SAVPF 111
c=IN IP4 0.0.0.0
a=ice-ufrag:j0w47g4z
a=ice-pwd:879b5n40s824s1985h3z60s77a8132v1
a=fingerprint: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
a=setup:passive
a=mid:0
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=sendonly
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=ssrc:3459677730 cname:648fef7tl720yj49
a=ssrc:3459677730 label:audio-8804l2a1
a=candidate:0 1 udp 2130706431 124.221.111.76 8000 typ host generation 0
m=video 9 UDP/TLS/RTP/SAVPF 106
c=IN IP4 0.0.0.0
a=ice-ufrag:j0w47g4z
a=ice-pwd:879b5n40s824s1985h3z60s77a8132v1
a=fingerprint: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
a=setup:passive
a=mid:1
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=sendonly
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:106 H264/90000
a=rtcp-fb:106 transport-cc
a=rtcp-fb:106 nack
a=rtcp-fb:106 nack pli
a=fmtp:106 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=ssrc:3459677731 cname:648fef7tl720yj49
a=ssrc:3459677731 label:video-7h7733ci
a=candidate: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打造音视频直播系统(李超)
相关文章:
SRS源码分析-SDP内容解析
前言 在学习SRS的RTC模块之前,首先来分析下SRS在将rtmp推流转成rtc流,通过浏览器拉取webrtc流场景下产生的SDP内容 SDP格式介绍 SDP数据是文本格式,由多个 <key><value> 表达式构成,<key>的值只能是一个字符…...
HTML 颜色
HTML 颜色 HTML 颜色采用的是 RGB 颜色,是通过对红 (R)、绿 (G)、蓝 (B) 三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB 即是代表红、绿、蓝三个通道的颜色。 Color Values HTML 颜色由一个十六进制符号来定义,这个符…...
MySQL高可用架构之InnoDB Cluster部署
MySQL高可用架构之InnoDB Cluster部署InnoDB Cluster适用场景准备工作安装MySQL Shell使用MySQL Shell搭建InnoDB Cluster初始化第一个实例创建InnoDB Cluster添加副本实例创建相关用户MySQL Router部署安装MySQL Router引导MySQL Router启动MySQL Router环境准备 主机名IPOS版…...
Linux安装minio单机版
说明:因为前面记录了一下minio的使用,这里说一下minio的安装,只是单机版哦 环境准备:Linux系统 说明图: 1.创建文件夹命令 我的是安装在/usr/local 文件夹下面的创建文件夹命令 #进入目标文件夹 cd /usr/local#创建…...
网络总结知识点(网络工程师必备)四
♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放,树高千尺,落叶归根人生不易,人间真情 目录 前言 71.NAPT有什么特点? 72.ARP欺骗解决方法...
数据结构——第三章 栈与队列(5)
共用栈和双队列1.共用栈2.双端队列栈与队列的本章小节1.共用栈 在实际应用中,有时一个应用程序需要多个栈,但这些栈的数据元素类型相同。假设每个栈都采用顺序栈,由于每个栈的使用情况不尽相同,势必会造成存储空间的浪费。若让多…...
CSDN竞赛第33期题解
CSDN竞赛第33期题解 1、题目名称:奇偶排序 给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。(奇数和偶数的顺序根据输入的数字顺序排 列) #include<bits/stdc.h> using namespace std; t…...
农产品销售系统的设计与实现
技术:Java、JSP等摘要:这篇文章主要描述的是农产品蔬菜在线销售系统的设计与实现。主要应用关于JSP网站开发技术,并联系到网站所处理的数据的结构特点和所学到的知识,应用的主要是Mysql数据库系统。系统实现了网站的基本功能&…...
C语言-基础了解-08-C判断
C判断 一、C判断 判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的)。 C 语言把任何非零和非空的值假定为 true,把零或 null 假…...
用数组名作函数参数的详解,以及形参实参采用数组名,形参实参采用指针变量的几种情况解析
关于地址,指针,指针变量可以参考我的这篇文章: 地址,指针,指针变量是什么?他们的区别?符号(*)在不同位置的解释?_juechen333的博客-CSDN博客https://blog.csd…...
k8s中的PV和PVS
前言:容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。首先,当容器崩溃时,kubelet 会重启它,但是容器中的文件将丢失——容器以干净的状态(镜像最初的状态)…...
【云原生】Gateway网关选型
网关一般分为流量网关和业务网关,流量网关负责接入所有的流量,并分发给不同的子系统,那在具体的业务接入之前,还有一层业务网关。流量网关提供全局性的、与后端业务应用无关的策略,例如 HTTPS证书卸载、Web防火墙、全局…...
QML Button详解
1.Button简介 Button表示用户可以按下或单击的按钮控件。按钮通常用于执行一个动作,或回答一个问题。典型的按钮有确定、应用、取消、关闭、是、否和帮助。 Button继承自AbstractButton,提供了以下几种信号。 void canceled() //当按…...
【编程实践】什么是好/坏代码?非程序员的示例
What is good/bad code? An illustrated example for non-programmers 什么是好/坏代码?非程序员的示例 目录 What is good/bad code? An illustrated example for non-programmers什么是好/坏代码?非程序员的示例 So what is ‘Bad Code’, as a layperson?那么,作为…...
一个简单的Sublime设置
问题 如果读者熟悉我,应该会发现我经常使用 VSCode 作为主力编辑器,但随着我安装的 VSCode 的插件逐渐增加,我发现对于部分较小的任务使用 VSCode 过于笨重,比如简单的 Markdown 文件编辑工作。 在经过一系列寻找后,…...
c语言经典例题-选择结构程序设计进阶
(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 快递费用计算: 题目: 代码思路: 代码表示: 计算一元二…...
NOI 2023春季测试 游记
怎么说,没遇到大波折即幸运。 Day 0 睡到下午三点,然后列了一堆复习计划,大概是左偏树等一些早就忘没的科技。 但是沉迷打块,最后基本什么计划也没完成。 白天睡多了,晚上睡不着,大概半梦半醒过了一整夜…...
【VC 7/8】vCenter Server 基于文件的备份和还原Ⅱ——使用 FTP 协议备份 VC(VAMI 英文)
目录2. 备份 vCenter Server2.1 使用 FTP 协议备份 VC(1)登录 vCenter Server 管理界面(2)进入Backup页面(3)配置 Backup Schedule(4)开始备份(5)备份成功&am…...
Python基础—文件操作(二)
Python基础—文件操作(二) CSV格式文件 逗号分隔值,以纯文本形式存储表格数据 由任意数目的记录组成,记录间以换行符分隔 每条记录由字段组成,字段间用逗号或制表符分隔 每条记录都有同样的字段序列 如有列名,位于文件第一行 每条…...
学校的班级个数【并查集基础应用,Java实现】
题目描述 现有一个学校,学校中有若干个班级,每个班级中有若干个学生,每个学生只会存在于一个班级中。如果学生A和学生B处于一个班级,学生B和学生C处于一个班级,那么我们称学生A和学生C也处于一个班级。 现已知学校中共…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...
《信号与系统》第 6 章 信号与系统的时域和频域特性
目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...
ThreadLocal 源码
ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物,因为每个访问一个线程局部变量的线程(通过其 get 或 set 方法)都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段,这些类希望将…...
LangChain【6】之输出解析器:结构化LLM响应的关键工具
文章目录 一 LangChain输出解析器概述1.1 什么是输出解析器?1.2 主要功能与工作原理1.3 常用解析器类型 二 主要输出解析器类型2.1 Pydantic/Json输出解析器2.2 结构化输出解析器2.3 列表解析器2.4 日期解析器2.5 Json输出解析器2.6 xml输出解析器 三 高级使用技巧3…...
AWS vs 阿里云:功能、服务与性能对比指南
在云计算领域,Amazon Web Services (AWS) 和阿里云 (Alibaba Cloud) 是全球领先的提供商,各自在功能范围、服务生态系统、性能表现和适用场景上具有独特优势。基于提供的引用[1]-[5],我将从功能、服务和性能三个方面进行结构化对比分析&#…...
使用python进行图像处理—图像滤波(5)
图像滤波是图像处理中最基本和最重要的操作之一。它的目的是在空间域上修改图像的像素值,以达到平滑(去噪)、锐化、边缘检测等效果。滤波通常通过卷积操作实现。 5.1卷积(Convolution)原理 卷积是滤波的核心。它是一种数学运算,…...
