news 2026/9/11 10:34:27

SRS C++ 媒体服务器源码地图:从 trunk/src 模块划分到 ST 协程与第三方依赖集成

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SRS C++ 媒体服务器源码地图:从 trunk/src 模块划分到 ST 协程与第三方依赖集成

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/srcmain/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.cpptrunk/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()(入口文件)中完整读到:

  1. 创建三个全局根对象:SrsFileLog(日志)、SrsThreadContext(线程上下文)、SrsConfig(配置),对应源码中的_srs_log_srs_context_srs_config三个全局指针;
  2. 调用_srs_config->parse_options(argc, argv)解析命令行参数,随后chdir到工作目录、初始化 cwd;
  3. 日志初始化、check_config()配置校验、show_macro_features()打印编译期宏特性(HLS/DASH/SRT/HTTP-API/转码等);
  4. run_directly_or_daemon()决定前台运行还是 daemon 化:daemon 模式通过两次fork()将孙进程托付给 init(见 srs_main_server.cpp),在 Docker 环境下会依据disable_daemon_for_docker()自动关闭 daemon;
  5. 最终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_deprecatedSrsUniquePtr智能指针(RAII)与为兼容保留的旧SrsAutoFree宏;
  • srs_core_performance:性能调优常量,如 merged-read(合并读)、merged-write(合并写)等;这些常量会在启动日志中打印(例如srs_main_server.cppshow_macro_features()输出的mw sleepmr enabledplay-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_bufferSrsBuffer,在字节数组上移动的二进制读写游标;
  • srs_kernel_streamSrsSimpleStream,可增长的字节缓冲;
  • srs_kernel_io:抽象 I/O 接口ISrsReaderISrsSeekerISrsWriter
  • 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:带宽统计(ISrsProtocolStatisticISrsClock);
  • 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 协程封装(ISrsCoroutineISrsCoroutineHandler)。

五、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_streamSrsFastStream,基于 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)是这层的总协调者,其类声明同时实现了ISrsLiveSourceHandlerISrsTcpHandlerISrsUdpMuxHandlerISrsSignalHandlerISrsApiServerOwnerISrsRtcApiServer等多个接口,内部聚合了 live source manager、connection manager、DTLS 证书、RTC/SRT source manager 等组件。

6.1 服务器核心

  • srs_app_serverSrsServer主类,管理监听器与连接;
  • 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:协程实现(SrsFastCoroutineSrsExecutorCoroutine);
  • srs_app_log:基于文件的日志实现。

6.2 各协议的应用层

  • RTMPsrs_app_rtmp_conn(推流 publish / 播放 play 的连接生命周期)、srs_app_rtmp_source(直播源:管理消费者、GOP 缓存、hub);
  • HTTPsrs_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
  • WebRTCsrs_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);
  • SRTsrs_app_srt_serversrs_app_srt_conn(推/拉生命周期)、srs_app_srt_sourcesrs_app_srt_listener(bind/accept);
  • RTSPsrs_app_rtsp_connsrs_app_rtsp_source
  • GB28181srs_app_gb28181(SIP 信令与 PS 流摄取)。

6.3 媒体业务功能

  • HLS/DASHsrs_app_hls(TS 分片 + M3U8 播放列表)、srs_app_dash(fMP4 分片 + MPD 清单)、srs_app_fragment(分片/切片接口);
  • DVRsrs_app_dvr(FLV/MP4 落盘录制);
  • Edge/Forward/Bridgesrs_app_edge(Edge 模式:从 Origin 拉/推)、srs_app_forward(转发到另一台 RTMP 服务器)、srs_app_stream_bridge(RTMP↔RTC↔SRT 源之间的桥接);
  • Ingest/Transcodesrs_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.cppsrs_protocol_amf0.hppsrs_kernel_flv.cpp。掌握这一约定后,仅凭文件名即可判断文件属于哪一层、服务于哪个主题,这是快速定位代码的最有效捷径。

七、配置体系:trunk/conf/

trunk/conf/下的配置只服务于 C++ 媒体服务器,下一代 Go 服务器不使用这些配置。核心文件:

  • trunk/conf/srs.conf:默认配置。以 srs.conf 为例,它包含全局max_connectionsdaemon,以及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,含maxbwconnect_timeoutlatencytlpktdrop等传输参数,见 srt.conf)、hls.confdvr.*.confedge.confforward.*.confgb28181.confdash.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.Smd_linux2.Smd_darwin.Smd_cygwin64.S):平台检测与上下文切换宏/汇编实现。

trunk/src/core/srs_kernel_st.hpp中,SRS 将 ST 封装为ISrsCoroutineISrsCoroutineHandler等接口,应用层的SrsFastCoroutine(srs_app_st.hpp)即建立在此之上。

九、FFmpeg 集成:两条相互独立的路径

C++ 服务器通过两条完全独立的路径使用 FFmpeg,二者不能混为一谈:

  1. 进程内 FFmpeg API(SRS_FFMPEG_FIT)srs_app_rtc_codec直接调用libavcodeclibswresamplelibavutil,在 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 日志处理)两条线追踪。
  2. 外部 FFmpeg 二进制srs_app_ingestsrs_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++ 服务器的进程内音频转码使用,构建libavcodeclibswresamplelibavutil三个库,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.cencode.cavpacket.coptions.cutils.c)、组件注册(allcodecs.ccodec_list.c等,由 configure 重新生成)、AAC 全套(aacdec*aacenc*aacps*aacsbr*aactab*aacpsy.clatm_parser.c)、原生 Opus(opusdec.copusenc*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.cSwrContext选项);
  • 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 后端密码套件。

  • 构建与公共 APIconfigure/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.caes_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++ 媒体服务器用它构建libssllibcrypto,服务于:TLS/HTTPS、RTMP complex 握手、WebRTC DTLS 与证书、HMAC/DH/AES 辅助、可选的 libSRTP 加速、SRT 加密。Go 服务器不使用该树。SRS 通常构建静态、禁用线程的库,并按目标平台与 NASM 设置选择汇编。

  • 构建与 APIConfigure/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.cs3_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 后端、构建选项)、configureconfigure-data.tcl(把 configure 选项翻译为 CMake 设置)、scripts/(特性检查、日志/错误生成、pkg-config 模板、跨平台与打包)、common/(Windows/POSIX 兼容源);
  • 公共 API 与 socket 生命周期(srtcore/srt.h(公共 C API 与选项)、srt_c_api.cppapi.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++ 服务器相关任务,可以按如下路径快速定位:

  1. 看入口trunk/src/main/srs_main_server.cppdo_main()理清启动与 daemon 流程;
  2. 定层次:按core(基础)→kernel(零件)→protocol(协议)→app(业务)自底向上判断问题所属层;
  3. 按命名找文件srs_{module}_{topic}.cpp/.hpp约定直接给出模块归属;
  4. 看配置trunk/conf/full.conf查参数、trunk/conf/srs.conf等专项配置看默认值,再到 srs_app_config.cpp 中追解析实现;
  5. 追第三方依赖:进程内音频转码进ffmpeg-4-fitSRS_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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/11 10:31:13

PS2 模拟器 PCSX2 首次配置与画面调优指南

PS2 模拟器 PCSX2 首次配置与画面调优指南 【免费下载链接】pcsx2 PCSX2 - The Playstation 2 Emulator 项目地址: https://gitcode.com/GitHub_Trending/pc/pcsx2 这篇文章用大白话讲清 PCSX2 这个 PS2 模拟器的配置全流程:开机前查什么、BIOS 文件怎么放、…

作者头像 李华
网站建设 2026/9/11 10:30:55

WorkBuddy开放平台接入实战:从Agent创建到Skill编排与稳定部署

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/11 10:30:55

蘑菇分类实战:从特征工程到随机森林的机器学习完整流程

简介:这是一份基于机器学习的蘑菇分类实战项目资料包,定位清晰,主要面向计算机相关专业的学生、毕业设计者及机器学习入门开发者,可广泛用于课程设计、课程大作业或项目立项演示。项目依托mushrooms.csv数据集,通过Pyt…

作者头像 李华