SRS C++ 媒体服务器源码地图:从 trunk/src 模块划分到 ST 协程与第三方依赖集成
【免费下载链接】srsSRS is a simple, high-performance, AI-driven real-time media server supporting RTMP, WebRTC, HLS, HTTP-FLV, HTTP-TS, SRT, MPEG-DASH, and GB28181, with codec support for H.264, H.265, AV1, VP9, AAC, Opus, and G.711.项目地址: https://gitcode.com/GitHub_Trending/sr/srs
本篇技术指南基于 SRS 仓库内部的 C++ 服务器代码导航参考(skills/internal-codemap-for-srs/references/cpp-server.md)展开,完整梳理第一代 C++ 媒体服务器的源码布局:trunk/src下main/core/kernel/protocol/app五层的职责边界、trunk/conf配置体系、State Threads 协程库,以及 FFmpeg、libSRTP、OpenSSL、SRT 四条第三方依赖的集成方式。读者读完可以掌握"遇到 C++ 服务器相关任务时,该去哪个目录、读哪些文件、如何追踪调用链"的完整导航能力,也能理解 SRS 单进程内同时承载 RTMP/WebRTC/HLS/SRT 等多协议的代码组织方式。
一、总览:同时承担 Origin 与 Edge 职责的 C++ 媒体服务器
SRS 的第一代 C++ 媒体服务器代码全部位于trunk/src/,它同时扮演两种角色:
- Origin 服务器:直接接收推流(RTMP/SRT/GB28181 等),对外分发(HLS/HTTP-FLV/WebRTC 等);
- Edge 服务器:从 Origin 拉流回源,为终端用户提供就近分发(见
trunk/src/app/srs_app_edge.cpp与trunk/conf/edge.conf)。
该服务器使用ST(State Threads)协程库(trunk/3rdparty/st-srs/)实现并发,是承载 SRS 全部能力的"全功能服务器"。与之相对的下一代 Go 服务器(cmd/、internal/)不使用 ST,也不读取trunk/conf/下的配置文件——这是阅读源码前必须先建立的两个边界。
从源码结构看,trunk/src内部按依赖层次自底向上分为五层:
| 目录 | 定位 | 是否涉及网络/协议 |
|---|---|---|
main/ | 进程入口,启动服务器 | 否 |
core/ | 基础定义:宏、版本、平台抽象、时间、性能常量 | 否 |
kernel/ | 底层构建块:编解码、容器、缓冲区、RTC 原语、工具 | 否(纯算法/数据结构) |
protocol/ | 协议实现:wire format 解析与序列化 | 是(协议层) |
app/ | 应用逻辑:连接生命周期、业务功能 | 是(应用层) |
二、main/:进程入口
trunk/src/main/srs_main_server.cpp是整个服务器的main()入口,启动流程可在do_main()(入口文件)中完整读到:
- 创建三个全局根对象:
SrsFileLog(日志)、SrsThreadContext(线程上下文)、SrsConfig(配置),对应源码中的_srs_log、_srs_context、_srs_config三个全局指针; - 调用
_srs_config->parse_options(argc, argv)解析命令行参数,随后chdir到工作目录、初始化 cwd; - 日志初始化、
check_config()配置校验、show_macro_features()打印编译期宏特性(HLS/DASH/SRT/HTTP-API/转码等); run_directly_or_daemon()决定前台运行还是 daemon 化:daemon 模式通过两次fork()将孙进程托付给 init(见 srs_main_server.cpp),在 Docker 环境下会依据disable_daemon_for_docker()自动关闭 daemon;- 最终
run_srs_server()创建SrsServer并依次执行initialize()与run()。
三、core/:全代码库的基础定义层
trunk/src/core/不含任何网络与协议逻辑,只提供被所有模块共享的基础设施:
srs_core:核心头文件、宏,以及由configure生成的定义(SRS_*系列宏),是每个源文件都 include 的第一份头;srs_core_version~srs_core_version8:按大版本(SRS 1.x~8.x)划分的版本定义,代码库同时保留多代版本定义用于兼容性判断;srs_core_autofree/srs_core_deprecated:SrsUniquePtr智能指针(RAII)与为兼容保留的旧SrsAutoFree宏;srs_core_performance:性能调优常量,如 merged-read(合并读)、merged-write(合并写)等;这些常量会在启动日志中打印(例如srs_main_server.cpp中show_macro_features()输出的mw sleep、mr enabled、play-queue);srs_core_platform:平台抽象,涵盖 32/64 位、PRId64格式化宏、大文件支持;srs_core_time:时间类型与换算,核心是srs_utime_t以及 ms/us 之间的转换工具。
四、kernel/:无网络、无协议的底层构建块
trunk/src/kernel/是"纯技术零件"层,不感知连接与业务。按职责可分成四组:
4.1 媒体编解码与容器
srs_kernel_codec:编解码器定义,H.264/H.265/AAC 的解析、序列头(sequence header)处理;srs_kernel_aac/srs_kernel_mp3:AAC 与 MP3 的 transmuxer(原始音频流输出);srs_kernel_flv:FLV tag 的读写、muxer/demuxer,是 HTTP-FLV 与 DVR 的底层依赖;srs_kernel_mp4:MP4/fMP4 box 的读写,服务于 DASH 与 HLS fMP4 模式;srs_kernel_ts:MPEG-TS muxer/demuxer,服务 HLS;srs_kernel_ps:PS(Program Stream)muxer/demuxer,服务于 GB28181 的 PS 流摄取;srs_kernel_packet:媒体包SrsMediaPacket——带时间信息的原始未解码帧,是整个媒体链路中流转的核心数据结构。
4.2 缓冲区与 I/O
srs_kernel_buffer:SrsBuffer,在字节数组上移动的二进制读写游标;srs_kernel_stream:SrsSimpleStream,可增长的字节缓冲;srs_kernel_io:抽象 I/O 接口ISrsReader、ISrsSeeker、ISrsWriter;srs_kernel_file:基于上述接口的文件读写实现。
4.3 RTC 原语
srs_kernel_rtc_rtp:RTP 包结构、编解码;srs_kernel_rtc_rtcp:RTCP 包类型、编解码;srs_kernel_rtc_queue:RTP 环形缓冲与乱序重排队列(WebRTC 丢包重传的基础)。
4.4 工具与基础设施
srs_kernel_error:错误码定义与SrsCplxError复杂错误对象;srs_kernel_log:日志级别与ISrsLog接口;srs_kernel_consts:全局常量(chunk size、超时、限额);srs_kernel_utility:系统时间、字符串辅助、bit buffer;srs_kernel_kbps:带宽统计(ISrsProtocolStatistic、ISrsClock);srs_kernel_balance:负载均衡算法(round-robin);srs_kernel_hourglass:定时器/沙漏协程,提供周期性回调;srs_kernel_pithy_print:采样日志——每隔 N 秒打印一次而非每条消息都打印,防止刷屏;srs_kernel_factory:抽象工厂接口(ISrsKernelFactory);srs_kernel_resource:资源管理接口(ISrsResource、disposing 机制);srs_kernel_st:ST 协程封装(ISrsCoroutine、ISrsCoroutineHandler)。
五、protocol/:协议实现与 wire format
trunk/src/protocol/负责所有协议的报文格式解析、序列化与连接交换,不承载业务逻辑。
5.1 RTMP 家族
srs_protocol_rtmp_stack:RTMP chunk stream、消息解析、AMF 命令;srs_protocol_rtmp_conn:RTMP 客户端/服务端的握手与命令交换;srs_protocol_rtmp_handshake:RTMP 握手(simple 与 complex 两种,complex 依赖 OpenSSL 的 HMAC);srs_protocol_rtmp_msg_array:自动释放的共享消息数组;srs_protocol_amf0:AMF0 编解码。
5.2 HTTP 家族
srs_protocol_http_stack:HTTP 消息、头、URI、serve mux 与 handler;srs_protocol_http_conn:HTTP 连接解析(请求/响应);srs_protocol_http_client:出站 HTTP 客户端(用于 heartbeat、hooks 回调);srs_protocol_http_stack_llhttp:llhttp 解析器(源自 Node.js);srs_protocol_http_stack_llhttpadapter/llhttpapi/llhttphttp:llhttp 在 SRS 中的适配与 API 集成。
5.3 RTC / WebRTC
srs_protocol_rtc_stun:STUN 包解析/构建;srs_protocol_sdp:SDP 解析/构建;srs_protocol_rtp:RTP 打包器(H.264/Opus → RTP 包)。
5.4 其他协议与媒体、基础设施
srs_protocol_srt:SRT socket 封装;srs_protocol_rtsp_stack:RTSP 消息解析;srs_protocol_raw_avc:原始 H.264/H.265 流(Annex-B ↔ AVCC 转换);srs_protocol_format:媒体格式——从 RTMP 流中提取 metadata 与 codec 信息;srs_protocol_io:协议级 I/O 接口(ISrsProtocolReader/Writer);srs_protocol_st:ST 初始化、socket 辅助、TCP/UDP 封装;srs_protocol_stream:SrsFastStream,基于 merge-read 的缓冲流;srs_protocol_conn:基础连接接口(ISrsConnection);srs_protocol_log:日志的线程上下文(SrsThreadContext);srs_protocol_json:JSON 解析(SrsJsonAny);srs_protocol_utility:URL 解析、流 URL 辅助;srs_protocol_protobuf:Protobuf 编码辅助(供 Prometheus/exporter 使用)。
六、app/:应用逻辑与业务功能
trunk/src/app/是功能最密集的一层,把协议层的能力组装成可用的服务器功能。SrsServer(srs_app_server.hpp)是这层的总协调者,其类声明同时实现了ISrsLiveSourceHandler、ISrsTcpHandler、ISrsUdpMuxHandler、ISrsSignalHandler、ISrsApiServerOwner、ISrsRtcApiServer等多个接口,内部聚合了 live source manager、connection manager、DTLS 证书、RTC/SRT source manager 等组件。
6.1 服务器核心
srs_app_server:SrsServer主类,管理监听器与连接;srs_app_config:配置解析与访问。配置以指令树(SrsConfDirective)组织,SrsConfig::parse_buffer()将配置文本解析为 name/args/子指令的三元结构(参见 srs_app_config.hpp 的示例);所有业务模块通过_srs_config->get_xxx()读取配置;srs_app_listener:TCP/UDP 监听管理;srs_app_reload:配置热重载处理器接口;srs_app_st:协程实现(SrsFastCoroutine、SrsExecutorCoroutine);srs_app_log:基于文件的日志实现。
6.2 各协议的应用层
- RTMP:
srs_app_rtmp_conn(推流 publish / 播放 play 的连接生命周期)、srs_app_rtmp_source(直播源:管理消费者、GOP 缓存、hub); - HTTP:
srs_app_http_api(/api/v1/...端点)、srs_app_http_conn(连接路由到 static/stream/api)、srs_app_http_hooks(on_connect、on_publish 等回调钩子)、srs_app_http_static(静态文件服务)、srs_app_http_stream(HTTP 直播:FLV/TS/AAC/MP3 over HTTP)、srs_app_http_client; - WebRTC:
srs_app_rtc_server(RTC 连接管理)、srs_app_rtc_conn(publish/play 会话、DTLS/SRTP)、srs_app_rtc_source(RTC 消费者与 track 管理)、srs_app_rtc_api(WHIP/WHEP 端点)、srs_app_rtc_codec(AAC ↔ Opus 音频转码,经 FFmpeg)、srs_app_rtc_dtls(DTLS 证书与握手)、srs_app_rtc_network(RTC 网络 I/O、UDP mux); - SRT:
srs_app_srt_server、srs_app_srt_conn(推/拉生命周期)、srs_app_srt_source、srs_app_srt_listener(bind/accept); - RTSP:
srs_app_rtsp_conn、srs_app_rtsp_source; - GB28181:
srs_app_gb28181(SIP 信令与 PS 流摄取)。
6.3 媒体业务功能
- HLS/DASH:
srs_app_hls(TS 分片 + M3U8 播放列表)、srs_app_dash(fMP4 分片 + MPD 清单)、srs_app_fragment(分片/切片接口); - DVR:
srs_app_dvr(FLV/MP4 落盘录制); - Edge/Forward/Bridge:
srs_app_edge(Edge 模式:从 Origin 拉/推)、srs_app_forward(转发到另一台 RTMP 服务器)、srs_app_stream_bridge(RTMP↔RTC↔SRT 源之间的桥接); - Ingest/Transcode:
srs_app_ingest(通过外部 FFmpeg 兼容二进制拉流)、srs_app_encoder(配置并监督外部 FFmpeg 转码任务)、srs_app_ffmpeg(把 ingest/transcode 配置翻译成 FFmpeg CLI 参数)。
6.4 工具与安全类
srs_app_security:推/拉流的 allow/deny 规则;srs_app_refer:Referer 防盗链校验;srs_app_statistic:服务器/流/客户端统计;srs_app_heartbeat:向 API server 的 HTTP 心跳;srs_app_utility:系统信息、磁盘/CPU/内存统计;srs_app_process:子进程管理(转码/ingest 的进程监督);srs_app_async_call:异步 HTTP 回调执行;srs_app_recv_thread:后台 RTMP 消息接收线程;srs_app_ng_exec:exec 钩子(如 on_publish 执行外部命令);srs_app_factory:应用级工厂(文件 I/O、路径);srs_app_coworkers:Origin 集群协调;srs_app_latest_version:向上游查询最新版本;srs_app_caster_flv:HTTP-FLV 推流摄取(stream caster);srs_app_mpegts_udp:MPEG-TS over UDP 摄取;srs_app_stream_token:推流 token 管理;srs_app_circuit_breaker:过载保护的熔断器;srs_app_hds:HDS(Adobe HTTP Dynamic Streaming)。
6.5 文件命名约定
所有 C++ 源文件遵循srs_{module}_{topic}.cpp/.hpp命名:例如srs_app_rtmp_conn.cpp、srs_protocol_amf0.hpp、srs_kernel_flv.cpp。掌握这一约定后,仅凭文件名即可判断文件属于哪一层、服务于哪个主题,这是快速定位代码的最有效捷径。
七、配置体系:trunk/conf/
trunk/conf/下的配置只服务于 C++ 媒体服务器,下一代 Go 服务器不使用这些配置。核心文件:
trunk/conf/srs.conf:默认配置。以 srs.conf 为例,它包含全局max_connections、daemon,以及rtmp(1935 端口)、http_api(1985 端口)、http_server(8080 静态服务)、rtc_server(8000 UDP,candidate $CANDIDATE支持环境变量注入候选地址)、vhost __defaultVhost__(默认虚拟主机,内含 hls、http_remux、rtc 开关);trunk/conf/full.conf:全量参考配置,所有选项均有注释说明,是查阅任意参数的首选;- 功能专项配置:
rtc.conf(WebRTC,演示rtc_server/rtmp_to_rtc/rtc_to_rtmp)、srt.conf(SRT,含maxbw、connect_timeout、latency、tlpktdrop等传输参数,见 srt.conf)、hls.conf、dvr.*.conf、edge.conf、forward.*.conf、gb28181.conf、dash.conf等。
配置解析的底层实现在 srs_app_config.cpp(接口声明见 srs_app_config.hpp):SrsConfigBuffer读取文件内容,SrsConfDirective::parse()递归地把文本解析为指令树,支持热重载(SrsReloadState状态机:Parsing → Transforming → Applying → Finished),并通过subscribe()让各模块注册 reload 回调。
八、State Threads:C++ 服务器的协程库
trunk/3rdparty/st-srs/是 C++ 媒体服务器专属的 ST 协程库,Go 服务器不使用。ST 源自 Netscape Portable Runtime,通过保存/恢复栈实现轻量级协程,让 SRS 以同步的代码风格获得高并发能力。关键文件:
sched.c:调度器——线程创建、上下文切换、运行循环(_st_this_vp、_st_this_thread等线程局部变量在此定义,见 sched.c);io.c:I/O 封装——poll/epoll/kqueue 包装与 socket 操作;event.c:事件系统;stk.c:栈分配与管理;sync.c:互斥锁、条件变量;key.c:线程局部存储;common.c/common.h:共享内部实现;public.h:公共 API;md.h与各平台汇编文件(md_linux.S、md_linux2.S、md_darwin.S、md_cygwin64.S):平台检测与上下文切换宏/汇编实现。
在trunk/src/core/srs_kernel_st.hpp中,SRS 将 ST 封装为ISrsCoroutine、ISrsCoroutineHandler等接口,应用层的SrsFastCoroutine(srs_app_st.hpp)即建立在此之上。
九、FFmpeg 集成:两条相互独立的路径
C++ 服务器通过两条完全独立的路径使用 FFmpeg,二者不能混为一谈:
- 进程内 FFmpeg API(SRS_FFMPEG_FIT):
srs_app_rtc_codec直接调用libavcodec、libswresample、libavutil,在 RTMP→RTC 与 RTC→RTMP 桥接中进行包级 AAC/MP3/Opus 音频转换。该路径在SRS_FFMPEG_FIT宏下编译,通常链接裁剪后的trunk/3rdparty/ffmpeg-4-fit/库到objs/srs,不会启动 FFmpeg 进程。阅读时沿srs_app_rtc_source(桥接所有权)与srs_app_rtc_codec(解码、重采样、FIFO、编码、FFmpeg 日志处理)两条线追踪。 - 外部 FFmpeg 二进制:
srs_app_ingest与srs_app_encoder创建srs_app_ffmpeg,后者拼装 CLI 参数并委托srs_app_process通过fork()/execv()启动配置的可执行文件。该路径覆盖通用 ingest、音视频转码、滤镜、截图、容器与协议转换,媒体通常以配置的 URL 进出 SRS 而非进程内帧。常规 SRS 源码构建用which找到宿主ffmpeg并复制到objs/ffmpeg/bin/ffmpeg,不会从ffmpeg-4-fit构建完整 CLI。Docker 工具链编译的 FFmpeg 版本、默认二进制选择与发布镜像打包,需另行查阅 Dev Docker 代码地图。
需要注意两组同名路径的不同角色:objs/ffmpeg/lib/及其头文件支撑链接 API,而objs/ffmpeg/bin/ffmpeg是独立可执行的 CLI。两条源码构建依赖路径都可从 trunk/auto/depends.sh 追踪——该脚本负责检查依赖工具、解析编译选项,并把ffmpeg-4-fit等 3rdparty 树配置进构建。
十、FFmpeg Fit:裁剪的进程内音频转码树
trunk/3rdparty/ffmpeg-4-fit/是裁剪后的 FFmpeg 4.x 源码树,仅供 C++ 服务器的进程内音频转码使用,构建libavcodec、libswresample、libavutil三个库,Go 服务器不使用。SRS 从trunk/auto/depends.sh配置该树,禁用无关的 FFmpeg 特性与汇编,并在SRS_FFMPEG_FIT启用时把产物链接进服务器。
- 构建与移植:
configure(特性与平台配置,重新生成启用的编解码器/组件列表)、Makefile(顶层构建与库排序)、ffbuild/(共享 make 规则与版本/pkg-config 生成脚本)、compat/(C 原子与va_copy兼容头)、LICENSE.md(许可证边界说明); libavcodec/:公共编解码 API(avcodec.h)、编解码生命周期(decode.c、encode.c、avpacket.c、options.c、utils.c)、组件注册(allcodecs.c、codec_list.c等,由 configure 重新生成)、AAC 全套(aacdec*、aacenc*、aacps*、aacsbr*、aactab*、aacpsy.c、latm_parser.c)、原生 Opus(opusdec.c、opusenc*、opus_celt*等)、外部 libopus 适配(libopus.c系列)、MP3(mpegaudiodec*等)、变换与加窗原语(fft*、mdct*、dct*等)、各架构实现(x86/、arm/、aarch64/,SRS 构建默认关闭汇编);libswresample/:swresample.c(重采样管线)、resample.c(采样率转换)、audioconvert.c(packed/planar 格式转换)、rematrix.c(声道布局与混音)、dither.c(抖动与噪声整形)、options.c(SwrContext选项);libavutil/:帧与引用计数缓冲(frame.*、buffer*、mem.*)、FIFO(audio_fifo.*、fifo.*)、声道与采样格式(channel_layout.*、samplefmt.*)、运行时选项(opt.*、dict.*、eval.*)、日志与错误(log.*、error.*)、时间与有理数(mathematics.*、rational.*、time.*)、CPU 检测(cpu.*及各架构目录);- 禁用残留:
libavdevice/、libavfilter/、libavformat/、libavresample/、libswscale/目录保留了部分上游文件,但 SRS 对这些库一律禁用、不链接进服务器。
十一、libSRTP Fit:WebRTC 的 RTP/RTCP 加解密
trunk/3rdparty/libsrtp-2-fit/是 vendored 的 libSRTP 2.3.0 源码,C++ WebRTC 栈用它保护/解保护 RTP 与 RTCP 包,构建libsrtp2;Go 服务器不使用。SRS 既可使用 libSRTP 内置的 AES/SHA 实现,也可在SRS_SRTP_ASM下启用 OpenSSL 后端密码套件。
- 构建与公共 API:
configure/configure.ac/Makefile.in(Autoconf 构建)、config_in.h等配置模板、include/srtp.h(会话、流策略、crypto policy、protect/unprotect、事件与版本 API)、include/srtp_priv.h(内部会话与密钥状态)、LICENSE(BSD); - 协议引擎:
srtp/srtp.c(SRTP/SRTCP 上下文、策略、流查找、密钥派生、认证/加密、重放检查与 protect/unprotect 入口)、srtp/ekt.c(加密密钥传输 EKT); - 密码子系统:
crypto/cipher/(内置 AES/AES-ICM,以及aes_icm_ossl.c、aes_gcm_ossl.c的 OpenSSL 后端、NSS 替代实现)、crypto/hash/(HMAC-SHA1 与 OpenSSL HMAC)、crypto/replay/(RTP 与扩展索引重放数据库 rdb/rdbx)、crypto/kernel/(注册、分配、密钥、错误报告)、crypto/math/; - 非运行时支持:
test/、fuzzer/、doc/为上游保留的测试、模糊测试与文档桩。
十二、OpenSSL Fit:TLS/DTLS 与密码学基础
trunk/3rdparty/openssl-1.1-fit/是 vendored 的 OpenSSL 1.1.1l 源码,C++ 媒体服务器用它构建libssl与libcrypto,服务于:TLS/HTTPS、RTMP complex 握手、WebRTC DTLS 与证书、HMAC/DH/AES 辅助、可选的 libSRTP 加速、SRT 加密。Go 服务器不使用该树。SRS 通常构建静态、禁用线程的库,并按目标平台与 NASM 设置选择汇编。
- 构建与 API:
Configure/config/Configurations/(目标与特性选择)、build.info系列(库清单)、util/与external/perl/(构建文件与符号生成器)、include/openssl/(公共 API)、LICENSE; - TLS/DTLS(
ssl/):ssl_lib.c(上下文/会话生命周期)、statem/(握手状态机)、record/(记录解析与加解密)、d1_lib.c/d1_msg.c/d1_srtp.c(DTLS 与 DTLS-SRTP 简档协商)、ssl_cert.c/ssl_rsa.c/ssl_sess.c(证书与会话)、ssl_ciph.c与s3_enc.c/t1_enc.c/tls13_enc.c(密码套件选择与各版本记录保护); - 密码学(
crypto/):evp/(高层摘要/加解密/签名 API)、bio/(抽象 I/O)、rand/(安全随机数)、hmac//sha//md5/(消息认证与摘要)、aes//modes//chacha//poly1305/(对称密码与 AEAD 模式)、bn//dh//ec//rsa/(大数与公钥算法)、asn1//x509//x509v3//pem/(证书结构)、err//objects//stack//lhash/(错误表与查找表); - 非运行时支持:
apps/(上游 openssl 命令实现,不链接进服务器)、engines/、fuzz/、ms/、os-dep/。
十三、SRT Fit:SRT 传输库
trunk/3rdparty/srt-1-fit/是 vendored 的 SRT 1.5.3 传输库,供 C++ 服务器的 SRT 监听器、连接与 source 使用,构建libsrt(不包含上游命令行应用),经 HaiCrypt 使用 OpenSSL 做负载加密;Go 服务器不使用。其许可证为 MPL 2.0(见LICENSE)。
- 构建与移植:
CMakeLists.txt(库版本、源码选择、crypto 后端、构建选项)、configure与configure-data.tcl(把 configure 选项翻译为 CMake 设置)、scripts/(特性检查、日志/错误生成、pkg-config 模板、跨平台与打包)、common/(Windows/POSIX 兼容源); - 公共 API 与 socket 生命周期(
srtcore/):srt.h(公共 C API 与选项)、srt_c_api.cpp、api.cpp(socket 创建、bind/listen/accept/connect、组与全局资源)、core.cpp(每 socket 协议引擎)、socketconfig.cpp(选项校验与继承); - 传输协议(
srtcore/):handshake.cpp(UDT/SRT 握手、扩展、协商与 rendezvous)、packet.cpp(数据/控制包)、channel.cpp(UDP 通道)、queue.cpp/epoll.cpp(多路复用与就绪)、buffer_snd.*/buffer_rcv.*(包缓冲、丢包列表、重传状态)、window.cpp/congctl.cpp(流控/拥塞窗口、带宽估计、live/file 拥塞控制)、tsbpd_time.cpp(基于时间戳的包投递)、packetfilter.*/fec.*(包过滤与 FEC)、group.cpp系列(socket 组与冗余链路)、crypto.cpp(到 HaiCrypt 的桥接); - HaiCrypt(
haicrypt/):haicrypt.h/hcrypt.c/hcrypt_ctx_rx.c等(加密 API、密钥上下文与轮换)、hcrypt_sa.c/hcrypt_msg.h/hcrypt_xpt_srt.c(安全关联与 SRT 包传输适配)、cryspr.c/cryspr-openssl*.c(crypto provider 抽象与 SRS 构建使用的 OpenSSL 后端),以及保留的上游cryspr-gnutls.*、cryspr-mbedtls.*替代后端。
十四、总结:一张图看懂 C++ 服务器源码导航
面对 C++ 服务器相关任务,可以按如下路径快速定位:
- 看入口:
trunk/src/main/srs_main_server.cpp的do_main()理清启动与 daemon 流程; - 定层次:按
core(基础)→kernel(零件)→protocol(协议)→app(业务)自底向上判断问题所属层; - 按命名找文件:
srs_{module}_{topic}.cpp/.hpp约定直接给出模块归属; - 看配置:
trunk/conf/full.conf查参数、trunk/conf/srs.conf等专项配置看默认值,再到 srs_app_config.cpp 中追解析实现; - 追第三方依赖:进程内音频转码进
ffmpeg-4-fit(SRS_FFMPEG_FIT)、WebRTC 加解密进libsrtp-2-fit、TLS/DTLS/握手密码学进openssl-1.1-fit、SRT 传输进srt-1-fit,两条 FFmpeg 路径(进程内 API 与外部 CLI)务必区分。
这份代码地图是 SRS 内部技能体系(skills/internal-codemap-for-srs/)的一部分,由 SKILL.md 中的 Reference Router 按任务类型路由加载;与 C++ 服务器并列的还有 Go 服务器(go-server.md)、浏览器端(browser-clients.md)、Docker 工具链(dev-docker.md)等代码地图,按需选择最小可信范围即可开始阅读。
【免费下载链接】srsSRS is a simple, high-performance, AI-driven real-time media server supporting RTMP, WebRTC, HLS, HTTP-FLV, HTTP-TS, SRT, MPEG-DASH, and GB28181, with codec support for H.264, H.265, AV1, VP9, AAC, Opus, and G.711.项目地址: https://gitcode.com/GitHub_Trending/sr/srs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考