SRS 开源之夏(GSoC 2022)学生贡献指南:8 个导师项目与参与全流程
【免费下载链接】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 是一个简单、高性能、实时视频服务器,支持 RTMP、WebRTC、HLS、HTTP-FLV、SRT 等主流直播与低延迟传输协议,其 C++ 核心代码位于 trunk/src。本文以 SRS 官方发布的 GSoC(Google Summer of Code)2022 学生招募文档为核心,完整介绍学生参与 SRS 社区贡献的入门路径、资格任务(Qualification Task)要求、开发与提交流程,并对当年开放的 8 个导师项目逐一展开:包括项目目标、所需技能、工作量评估、难度分级与资格任务,同时结合仓库内真实源码与配置,验证这些项目在 SRS 中的落地点。读完本文,你将掌握如何以学生身份加入 SRS 开源社区、如何完成一个合格补丁并进入导师项目,也能对 Prometheus 监控、YAML 配置解析、RISC 适配、DASH、LLHLS、异步 DNS、RIST 推流、官网文档重构等技术方向在 SRS 中的实现现状建立清晰的认知。
一、GSoC 项目背景与 SRS 简介
GSoC(Google Summer of Code)是 Google 发起的开源软件暑期编程项目,SRS 社区每年都会以导师身份参与,面向全球学生开放一系列定义良好的开发任务。本次文档对应的是GSoC 2022 周期,其关键时间节点为:
- 申请截止:4 月 19 日前必须向 Google 提交申请(即使资格任务尚未完成也要先提交,申请可以在 4 月 19 日之前持续改进,但之后不可再修改);
- 正式工作期:6 月 13 日开始,持续到 9 月结束;
- 具体官方时间表以 GSoC 官方时间线为准,本文不再赘述。
SRS 官方对自身的一句话描述是:"SRS is a simple, high efficiency and realtime video server, supports RTMP/WebRTC/HLS/HTTP-FLV/SRT."。从当前仓库看,SRS 的功能面已远不止于此:trunk/conf目录下存放着 full.conf、dash.conf、srt.conf、gb28181.conf 等大量配置示例,覆盖 RTMP、WebRTC、HLS、HTTP-FLV、HTTP-TS、SRT、MPEG-DASH、GB28181 等协议,以及 H.264/H.265/AV1/VP9/AAC/Opus/G.711 等编解码支持。这为 GSoC 学生提供了非常广阔的选题空间。
二、给学生的基础入门信息(Getting Started)
文档对学生提出了四条循序渐进的入门建议:
- 了解 SRS:加入 SRS 的 Discord 社区(频道
#general),浏览代码库并熟悉开发工作流;遇到问题可以随时提问,如果知道答案也鼓励帮助其他学生答疑。SRS 的总体架构与功能概览可参考仓库内的 srs-overview.md。 - 选择项目:本文第三部分列出了 8 个带导师(Mentored)的项目,以及可能需要自行联系导师的项目想法。导师项目定义清晰、已有导师自愿报名;学生也可以提出自己的项目创意,前提是更贴合自身兴趣与技能水平。如果项目描述不清楚,应直接联系对应导师,或在 Discord
#general频道咨询。 - 联系我们:确定项目后要与社区沟通、告知导师,尤其是打算做某个资格任务时,要让对应导师知道,以避免与其他学生重复劳动(每个学生应选择不同的资格任务)。
- 提交申请:务必在 4 月 19 日截止前向 Google 提交申请。
重要提示:文档明确强调,虽然 GSoC 申请对 Google 官方发放津贴很重要,但SRS 导师不会仅凭 GSoC 申请表做决定。导师评判学生的依据是资格任务的完成情况,从中考察编码能力、工具学习能力和沟通能力等。因此,学生不必过度担心申请表是否完美,但必须严格遵守 GSoC 的申请规则(这关系到能否拿到 Google 的报酬)。
资格任务(Qualification Task)
被 SRS 录取的前提是完成一个小型资格任务,所有资格任务都包含向开发邮件列表发送补丁这一环节。SRS 的开发门槛不低,资格任务正是用来判断学生是否足够有动力、是否有能力按期交付的手段:
- 资格任务通常写在各项目描述中,也可以联系对应导师获取,或参考 SRS 的 Bug Issue 寻找任务灵感;
- 一般情况下,资格任务应包含向 SRS Bug Issue 提交一个通过评审并被合入 SRS 代码库的补丁;
- 这类补丁往往需要多轮提交与评审迭代,所以第一版提交不要拖得太晚;
- 提交前请避开其他学生正在做的资格任务。
开发与提交要求(Development)
一旦入选某个项目,学生不仅需要交付可运行的实现,还必须将工作成果提交合入 SRS 代码库。提交时机应在第二个工作期结束前至少 2–3 周,通过 Bug Issue 和 Discord 交由社区与导师评审;评审后大概率会被要求修改并重新提交改进版本。如果对实现方式无法达成共识,应听从导师的建议。为了产出高质量补丁,文档要求先阅读开发者文档(原文档指向官方 v5 开发文档,仓库内的skills/srs-develop技能目录提供了更贴近当前仓库的开发指引,例如 develop-code.md 介绍了代码开发规范,fix-a-bug.md 介绍了修复 Bug 的流程,可作为替代参考)。
联系方式
- Discord:
#general频道; - SRS GSoC 管理员:Winlin(winlinvip@gmail.com)、Devin(devin@ossrs.io)、LiuQi(lq@chinaffmpeg.org);
- 针对某个具体项目的问题,也可以直接联系该项目页面上列出的导师。
三、8 个导师项目详解(Mentored Project Ideas)
以下项目均已定义明确且至少有一位可用导师。文档建议:如果你是 SRS 新手、多媒体经验相对较少,优先从这些导师项目中选择,而不是自拟项目。
项目 1:支持 Prometheus API
| 项目属性 | 内容 |
|---|---|
| 项目名称 | SRS 支持 Prometheus API |
| 项目描述 | Prometheus 是系统监控领域的常见组件,支持 Prometheus API 后,监控系统就能以图表形式展示 SRS 服务的相关属性,以及音视频帧率、码率等信息 |
| 导师 | Haibo Chen(nmgchenhaibo@foxmail.com) |
| 备选导师 | Junqin Zhang(chundonglinlin@163.com) |
| 所需技能 | 熟悉 HTTP 协议,理解 HTTP 服务端-客户端交互过程 |
| 预计工作量 | 180 小时 |
| 难度 | 入门(Beginner) |
| 预期结果 | 使用 Prometheus client 能够访问并获取预期结果 |
| 资格任务 | 完成 Prometheus API 的编写与测试 |
仓库落地点验证:该项目的成果在 SRS 中已作为exporter配置段落地。在 full.conf 中可以看到完整的 Prometheus exporter 配置:
exporter { # Whether exporter is enabled. # Overwrite by env SRS_EXPORTER_ENABLED # Default: off enabled off; # The http api listen port for exporter metrics. # Overwrite by env SRS_EXPORTER_LISTEN # Default: 9972 listen 9972; # The logging label to category the cluster servers. # Overwrite by env SRS_EXPORTER_LABEL label cn-beijing; # The logging tag to category the cluster servers. # Overwrite by env SRS_EXPORTER_TAG tag cn-edge; }各参数含义与默认值如下:
enabled:是否启用 exporter,默认off,可用环境变量SRS_EXPORTER_ENABLED覆盖;listen:exporter 指标服务的 HTTP 监听端口,默认9972(Prometheus 官方默认端口分配表中该端口即为 SRS 保留),可用SRS_EXPORTER_LISTEN覆盖;label:用于给集群服务器分类的标签,默认空,可用SRS_EXPORTER_LABEL覆盖;tag:用于给集群服务器分类的标签,默认空,可用SRS_EXPORTER_TAG覆盖。
这些配置的解析逻辑位于 srs_app_config.cpp,SrsConfig::get_exporter_enabled/listen/label/tag四个方法分别对应读取上述配置,且均支持SRS_OVERWRITE_BY_ENV_*环境变量覆盖机制。服务端监听器在 srs_app_server.cpp 中创建:
// Create exporter server listener. if (config_->get_exporter_enabled()) { exporter_listener_->set_endpoint(config_->get_exporter_listen()); exporter_listener_->set_label("Exporter-Server"); if ((err = exporter_listener_->listen()) != srs_success) { return srs_error_wrap(err, "exporter server listen"); } ... }指标数据的聚合则由统计模块完成,例如 srs_app_http_api.cpp 中调用stat_->dumps_metrics(send_bytes, recv_bytes, nstreams, nclients, total_nclients, nerrs)来输出发送字节、接收字节、流数、客户端数等指标。仓库还提供了一键启用的 prometheus.conf,其中exporter段直接开启:
exporter { enabled on; listen 9972; label cn-beijing; tag cn-edge; }这意味着学生完成该项目后,可以./objs/srs -c conf/prometheus.conf启动 SRS,然后在http://localhost:9972/metrics拉取 Prometheus 格式的监控指标。
项目 2:配置文件 YAML 解析
| 项目属性 | 内容 |
|---|---|
| 项目名称 | 配置文件支持 YAML 解析 |
| 项目描述 | SRS 当前配置文件是私有格式(类似 nginx),而 YAML 是常见的配置文件格式,熟悉其用法的人更多 |
| 导师 | Junqin Zhang(chundonglinlin@163.com) |
| 备选导师 | Haibo Chen(nmgchenhaibo@foxmail.com) |
| 所需技能 | 熟悉 YAML 文件格式及其解析方法,熟练使用 C++ 编程 |
| 预计工作量 | 175 小时 |
| 难度 | 入门(Beginner) |
| 预期结果 | SRS 现有配置文件可以转换为 YAML 解析并执行 |
| 资格任务 | 实现 YAML 文件的解析 |
仓库现状验证:截至当前仓库,SRS 的配置文件仍为类 nginx 的私有指令格式。以 full.conf 为例,配置由listen、vhost { ... }、exporter { ... }等指令块组成,解析入口由 srs_app_config.cpp 中的SrsConfig类实现,每个配置项对应一个get_xxx()方法。这一项目正是把该私有格式的解析扩展为兼容 YAML 输入,属于典型的入门级 C++ 工程任务——学生需要先理解SrsConfig的指令树(SrsConfDirective)模型,再实现 YAML 文本到指令树的转换。
项目 3:CPU 适配(RISC 平台移植)
| 项目属性 | 内容 |
|---|---|
| 项目名称 | SRS 移植到 RISC 平台,CPU 适配 |
| 项目描述 | SRS 底层使用协程 IO 库,目前已适配 Intel、ARM 等多个平台;随着 RISC 的逐步发展,支持 RISC 可进一步增强 SRS 的多平台支持 |
| 导师 | Winlin(winlinvip@gmail.com) |
| 备选导师 | Zhihong Xiao(hondaxiao@tencent.com)、Feng Yi(yifeng1983@gmail.com) |
| 所需技能 | 熟悉 RISC 平台汇编指令集,熟悉计算机程序执行原理 |
| 预计工作量 | 350 小时 |
| 难度 | 进阶(Advanced) |
| 预期结果 | 能在 RISC 平台运行 SRS,并正常运行 4.0 release 的全部功能 |
| 资格任务 | 实现 st-thread 在 RISC 平台上的栈保存、恢复逻辑 |
仓库落地点验证:SRS 的协程底层是 state-threads(ST),仓库内的trunk/3rdparty/st-srs目录存放了 ST 库源码,其中 md_linux.S、md_darwin.S、md_cygwin64.S 等汇编文件正是不同架构/系统下上下文切换(栈保存与恢复)的实现。资格任务要求的"st-thread 栈保存、恢复逻辑",就是在这些汇编文件中新增 RISC 指令集对应的上下文切换实现。从源码结构看,ST 库通过common.h、sched.c等文件管理线程调度,汇编层只负责最底层的寄存器与栈帧操作,这是该项目最核心也最需要谨慎的部分。
项目 4:DASH(SegmentTemplate Time 模式)
| 项目属性 | 内容 |
|---|---|
| 项目名称 | DASH 支持 SegmentTemplate Time 模式 |
| 项目描述 | 当前 SRS 的 DASH 仅支持 SegmentTemplate 的 Number 模式,而主流播放器更推荐 Time 模式 |
| 导师 | Zhihong Xiao(hondaxiao@tencent.com) |
| 备选导师 | Winlin(winlinvip@gmail.com)、Steven Liu(lq@chinaffmpeg.org) |
| 所需技能 | 熟悉 DASH 协议,理解视频封装,熟悉使用 C++ 编程 |
| 预计工作量 | 280 小时 |
| 难度 | 中等(Intermediate) |
| 预期结果 | 能使用 dash.js、VLC、ffplay 等常见播放器进行播放 |
| 资格任务 | 实现 DASH SegmentTemplate Time 模式 |
仓库落地点验证:SRS 的 DASH 功能由 srs_app_dash.cpp 与 srs_app_dash.hpp 实现,对应的 vhost 配置模板在 full.conf 的vhost dash.srs.com段,关键参数包括:
enabled:是否开启 DASH(默认off,用SRS_VHOST_DASH_ENABLED覆盖);dash_fragment:分片时长(秒),默认30;dash_update_period:MPD 更新周期(秒),默认150;dash_timeshift:时移缓冲区深度(秒),默认300;dash_path:DASH 文件的输出根目录,默认./objs/nginx/html;dash_mpd_file:MPD 文件路径模板,支持[vhost]、[app]、[stream]变量,默认[app]/[stream].mpd;dash_window_size:DASH 窗口大小(秒),默认5;dash_cleanup:是否清理过期分片文件,默认on;dash_dispose:无输入流时清理 DASH 文件的超时(秒),默认120。
该项目的核心工作就是让 MPD 中的SegmentTemplate从当前仅支持的Number模式扩展出Time模式,从而更好地兼容 dash.js、VLC、ffplay 等主流播放器。
项目 5:HLS 的 LLHLS 低延迟模式
| 项目属性 | 内容 |
|---|---|
| 项目名称 | HLS 支持 LLHLS 模式 |
| 项目描述 | HLS 是 Apple 提出的直播切片方案,当前缺点是延迟较长;LLHLS 可以大幅降低 HLS 的延迟 |
| 导师 | Zhihong Xiao(hondaxiao@tencent.com) |
| 备选导师 | Wei Shi(shiwei05@kuaishou.com) |
| 所需技能 | 熟悉 HLS、LLHLS,良好的标准文档阅读能力,熟悉 C++ 编程 |
| 预计工作量 | 350 小时 |
| 难度 | 进阶(Advanced) |
| 预期结果 | 能在支持 LLHLS 的播放器上播放,且延迟达到预期 |
| 资格任务 | LLHLS 编码、封装、manifest 文件生成 |
仓库落地点验证:SRS 的 HLS 功能位于 srs_app_hls.cpp 与 srs_app_hls.hpp,配置模板在 full.conf 的vhost hls.srs.com段,其中hls_fragment(分片时长,默认 10 秒)直接决定切片粒度,hls_use_fmp4可选择使用 fmp4 容器,hls_fragments_per_key(默认 5)控制加密场景下的密钥切换频率。LLHLS 的核心目标就是通过更精细的分片与 manifest 更新策略,把 HLS 从秒级延迟压缩到接近低延迟直播的水平。实现 LLHLS 需要深入理解 srs_app_hls.cpp 中的切片与 m3u8 生成链路,这正是资格任务"LLHLS 编码、封装、manifest 文件生成"要考察的能力。
项目 6:异步 DNS 解析
| 项目属性 | 内容 |
|---|---|
| 项目名称 | 异步 DNS 解析 |
| 项目描述 | SRS 使用的 IO 是协程 IO,但当前 DNS 解析仍是同步解析;异步 DNS 解析能更好地利用协程资源,避免 DNS 阻塞影响其他 IO |
| 导师 | Guanghua Chen(jinxue.cgh@alibaba-inc.com) |
| 备选导师 | Zhihong Xiao(hondaxiao@tencent.com) |
| 所需技能 | 熟悉 DNS 解析过程,熟悉 C++ 编程 |
| 预计工作量 | 180 小时 |
| 难度 | 进阶(Advanced) |
| 预期结果 | 能够执行异步 DNS 解析并通过测试 |
| 资格任务 | 完成 DNS 异步解析与协程封装 |
技术背景:SRS 的网络 IO 全部构建在 state-threads 协程之上,同步 DNS 解析(即调用系统getaddrinfo)会阻塞整个线程,导致同一线程上的其他协程 IO 被卡住。该项目要求把 DNS 解析封装进协程模型,使其在等待 DNS 响应时让出 CPU,从而不阻塞其他连接。协程基础可参考 srs_app_st.cpp 与trunk/3rdparty/st-srs中的调度实现。
项目 7:RIST 推流协议支持
| 项目属性 | 内容 |
|---|---|
| 项目名称 | RIST 推流协议支持 |
| 项目描述 | RIST 是近年来出现的流媒体协议,相比传统 RTP 推流有更好的特性,如更好的传输控制等 |
| 导师 | Zhihong Xiao(hondaxiao@tencent.com) |
| 备选导师 | Xiaojun Zhou(279686030@qq.com) |
| 所需技能 | 熟悉 RIST 推流协议,熟悉 C++ 编程 |
| 预计工作量 | 240 小时 |
| 难度 | 进阶(Advanced) |
| 预期结果 | 能向 SRS 推送 RIST 流,并转换为 RTMP/FLV/WebRTC 等 |
| 资格任务 | 完成 RIST 协议接收及向其他协议转封装 |
技术背景:RIST(Reliable Internet Stream Transport)面向互联网传输设计了丢包重传与拥塞控制机制,可靠性优于裸 RTP。该项目需要在 SRS 中新增 RIST 接收端,并将接收到的媒体流接入 SRS 现有的统一流转发/转封装链路(RTMP → FLV / WebRTC / HLS / DASH 等)。从仓库结构看,类似的"协议接入 + 转封装"模式已有先例:例如 srs_app_rtsp_conn.cpp、srs_app_srt_conn.cpp 分别完成了 RTSP、SRT 的接入,RIST 项目可复用这套"新协议连接处理器 + 复用器"的架构模式。
项目 8:官网文档内容重构
| 项目属性 | 内容 |
|---|---|
| 项目名称 | 官网文档内容重构 |
| 项目描述 | 梳理 SRS 现有的 wikis、文章、视频等资源,并整合到官方网站 |
| 导师 | Xiaowei Meng(542638787@qq.com) |
| 备选导师 | Xiaosong Dai(kunkkaco@gmail.com) |
| 所需技能 | 熟悉 JavaScript,熟练使用 SRS 服务器,英语良好 |
| 预计工作量 | 350 小时 |
| 难度 | 入门(Beginner) |
| 预期结果 | 通过阅读文档能轻松上手 SRS |
| 资格任务 | 完成官网文档、案例、博客以及社区各子模块的展示 |
仓库落地点验证:SRS 的文档体系在仓库中有非常丰富的素材:trunk/3rdparty/srs-docs/doc/下存放着 54 篇 Markdown 文档,trunk/3rdparty/srs-docs/blog/下存放着 35 篇博客文章(本文档即其中之一),trunk/3rdparty/srs-docs/pages/还有 3 个页面文件。此外skills/目录下的internal-docs-for-srs(含 cpp-docs 等 34 篇 C++ 文档)、srs-develop、srs-support等技能文档,都是该重构项目可直接整合的内容源。这个项目门槛最低但工作量不小,适合对 JavaScript、文档工程和 SRS 使用都比较熟悉的学生。
四、参与 SRS GSoC 的完整行动清单
综合文档内容,可以将学生参与 SRS GSoC 2022 的完整流程归纳为以下步骤:
- 加入社区:进入 Discord
#general频道,浏览代码库与开发流程,回答他人问题、提出自己的疑问; - 选题:优先从 8 个导师项目中选择(新手建议选入门/中等难度项目);也可联系导师获取更多想法或自拟项目;
- 认领资格任务:联系导师确认资格任务,避开其他学生正在做的任务;资格任务通常要求在 SRS Bug Issue 上提交一个能通过评审并合入代码库的补丁;
- 尽早提交申请:4 月 19 日前向 Google 提交 GSoC 申请,即使资格任务尚未完成(申请表可在截止前改进,但截止后不可修改);
- 开发与提交:入选后,在第二个工作期结束前 2–3 周将实现以补丁形式提交评审,按导师和社区意见迭代改进;
- 合入代码库:最终成果需要被接受合入 SRS 代码库,才算完整交付。
五、写在最后:如何评判与选择项目
从工作量与难度分布看,8 个项目的设计意图很清晰:
- 入门级(Beginner):Prometheus API(180 小时)、YAML 配置解析(175 小时)、官网文档重构(350 小时)——适合 SRS 新手,重点考察基本功与学习能力;
- 中等(Intermediate):DASH SegmentTemplate Time 模式(280 小时)——适合有一定流媒体基础的学生;
- 进阶(Advanced):RISC CPU 适配(350 小时)、LLHLS(350 小时)、异步 DNS(180 小时)、RIST 推流(240 小时)——需要扎实的底层知识与协议理解。
SRS 社区对学生的核心要求始终一致:不只是写代码,而是要能产出高质量、可合入、经得起多轮评审的补丁。因此,无论选择哪个项目,认真完成资格任务、熟悉 SRS 的配置体系(如 full.conf)与核心模块(如 srs_app_config.cpp、srs_app_hls.cpp、srs_app_dash.cpp)的代码风格,都是成功入选并完成项目的关键。
【免费下载链接】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),仅供参考