
SRS 实时流媒体服务器全景导读直播与 WebRTC 协议矩阵、可观测性与协程内核【免费下载链接】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/srsSRSSimple Realtime Server是一个开源的实时视频服务器以简单、高效为核心设计目标支持 RTMP、WebRTC、HLS、HTTP-FLV、SRT、MPEG-DASH 与 GB28181 等主流协议并内置 HTTP API、HTTP 回调与 Prometheus Exporter 等运维与业务集成能力。本文以 SRS 官方 Introduction 文档为主线结合当前仓库中的 完整配置示例、协程实现源码 与 版本记录系统梳理 SRS 的定位、协议能力、应用场景、可观测性、技术实现与社区治理帮助你快速判断 SRS 是否适合你的业务并找到后续深入学习的入口。SRS 是什么一个推拉流模型下的实时媒体服务器SRS 是一款遵循 MIT 许可证的开源实时视频服务器仓库根目录的 LICENSE 明确了其开源授权。官方文档对其定位是simple, high-efficiency, real-time video server即简单、高效、实时的视频服务器。它的核心工作模式是典型的**发布推流与订阅拉流**模型推流端把一路流送入 SRS播放端从 SRS 拉取同一路流。SRS 自身不生产内容而是与成熟的开源客户端生态协作推流端FFmpeg、OBS 等编码器/推流工具播放端VLC、FFplay、浏览器WebRTC/HTTP-FLV/HLS等。官方 Docker 快速开始 给出了最直观的一条命令跑起来的演示启动容器后用 FFmpeg 推送一路流再用 RTMP/HTTP-FLV/HLS/WebRTC 任选其一播放docker run --rm -it -p 1935:1935 -p 1985:1985 -p 8080:8080 ossrs/srs:5 ffmpeg -re -i ./doc/source.flv -c copy -f flv rtmp://localhost/live/livestream其中1935是 RTMP 监听端口1985是 HTTP API 端口8080是 HTTP 流媒体HTTP-FLV/HLS端口。推流后即可通过rtmp://localhost/live/livestreamVLC、http://localhost:8080/live/livestream.flvHTTP-FLV、http://localhost:8080/live/livestream.m3u8HLS等地址播放。SRS 的路由设计非常简单同一 vhost 下的任意 app/stream 组合即一路流无需为每个流单独配置。官方文档中的 Multiple Streams 一节指出只需改变推拉流 URL 即可扩展任意多路流例如rtmp://ip/live/livestream、rtmp://ip/liveN/livestreamNsrt://ip:10080?streamid#!::ranyM/streamN,mpublishhttp://ip:1985/rtc/v1/whip/?appanyMstreamstreamNhttp://ip:8080/anyM/streamN.flv、http://ip:8080/anyM/streamN.m3u8支持协议矩阵与客户端生态SRS 的协议支持覆盖了当前互联网音视频传输的主要形态领域协议典型用途直播推流RTMP、SRT、GB28181编码器/摄像头/监控设备接入直播拉流RTMP、HTTP-FLV、HLS、MPEG-DASH、HTTP-TS播放器、CDN 分发实时通信WebRTC、WHIP、WHEP浏览器/App 低延迟互动配套的客户端生态包括FFmpeg最常用的推流/转码工具SRS 文档中几乎所有推流示例都使用 FFmpegOBS桌面直播推流软件支持 RTMP 与 SRT 推流VLC跨平台播放器用于播放 RTMP/SRT 流注意 VLC 不支持 SRT 的 streamid 参数详见下文WebRTC浏览器原生实时通信标准SRS 以 SFU 形态接入。两大核心应用领域直播与 WebRTCSRS 的主战场是Live streaming直播与WebRTC实时通信两个领域。直播领域RTMP、HLS、SRT、MPEG-DASH、HTTP-FLV直播是 SRS 最成熟的能力域。以 RTMP 为接入基础SRS 可以同时输出 HLS、HTTP-FLV、HTTP-TS、MPEG-DASH 等协议。SRT是 SRS 的核心协议之一用于弱网、长距离、户外直播场景。SRT 基于 UDP时延通常在 300-500ms远低于 RTMP 的 1-3 秒。SRS 自 2020 年起支持 SRT并在回调与 API 层面对 SRT 与 RTMP 做了高度一致化处理。SRT 使用 MPEG-TS 封装因此天然支持 HEVC 等新编码。仓库中提供了 SRT 的专项配置 conf/srt.conf并通过环境变量覆盖参数如SRS_SRT_SERVER_ENABLED、SRS_SRT_SERVER_LISTEN、SRS_SRT_SERVER_MAXBW等。推流与播放 SRT 的典型命令参见 SRT 文档# 推流 ffmpeg -re -i ./doc/source.flv -c copy -pes_payload_size 0 -f mpegts \ srt://127.0.0.1:10080?streamid#!::rlive/livestream,mpublish # 播放 ffplay srt://127.0.0.1:10080?streamid#!::rlive/livestream,mrequestSRT URL 采用 YAML 风格的streamid表达语义#!::为起始标记r对应 RTMP 地址中的app/streamm取publish推流或request拉流支持用h指定 vhost。仓库还内置了面向不同客户端习惯的预置配置conf/srt.shortstreamid.publish.conf短 streamid 默认按推流处理、conf/srt.shortstreamid.play.conf默认按拉流处理与conf/srt.vlc.conf为不支持 streamid 的 VLC 设置默认 streamid。低延迟场景下文档建议按RTT * 3设置peerlatency/recvlatency/latency并开启tlpktdrop on与tsbpdmode on。WebRTC 领域WHIP 与 WHEPWebRTC 是 Google 开源的浏览器实时通信标准本质是浏览器与浏览器之间的点对点音视频通信由信令SDP 协商与媒体SRTP 加密、低延迟传输两部分组成并内置 NACK/FEC/GCC 拥塞控制、3A 音频处理等能力。在真实网络中两点直连几乎不可行需要服务器介入。SRS 在 WebRTC 体系中扮演SFUSelective Forwarding Unit选择性转发单元角色——浏览器只上传一份数据SFU 按需复制转发给其他订阅者相比 TURN 的中转与 MCU 的混流在并发能力与带宽成本之间取得平衡。与其他 SFU如 Janus不同的是SRS 以流为粒度组织媒体多人房间本质上仍是一路路独立的推/拉流因此可以把不同参与者分散到多个 SFU 上支撑更大规模的会议。SRS 通过 WHIP推流与 WHEP拉流 两种标准信令协议接入 WebRTCWHIP 推流POST http://localhost:1985/rtc/v1/whip/?applivestreamlivestreamWHEP 拉流POST http://localhost:1985/rtc/v1/whep/?applivestreamlivestream仓库源码 srs_app_rtc_api.cpp 中实现了这两组 API推流路径会触发http_hooks_on_publishsrs_app_rtc_api.cpp拉流路径会触发http_hooks_on_playsrs_app_rtc_api.cpp这也印证了介绍文档中HTTP Callback 同时适用于 WebRTC的说明——WHIP 推流走on_publishWHEP 拉流走on_play。WebRTC 的配置分为全局rtc_server与 vhost 级rtc两部分完整示例见 conf/full.conf。以下为核心参数rtc_server { # 是否启用 WebRTC 服务环境变量 SRS_RTC_SERVER_ENABLED默认 off enabled on; # UDP 监听端口复用给所有连接默认 8000 listen 8000; tcp { # WebRTC over TCP非 TURN用于 UDP 受限网络 enabled off; listen 8000; } # candidate 生成策略udp/tcp/all protocol udp; # 暴露给客户端的 candidate IP可用 * / $CANDIDATE / 指定 IP candidate *; }其中candidate是最容易踩坑的配置它必须是客户端能够访问到的服务器 IP。SRS 会自动检测网卡 IP也可通过环境变量$CANDIDATE传入或通过 URL 参数?eipip[:port]临时指定这在负载均衡/NAT 场景下尤其有用。vhost 级rtc配置full.conf 起还包括stun_timeout会话超时默认 30s客户端通过 STUN binding 请求作为心跳nack on/off是否启用丢包重传ARQtwcc on/off是否启用传输层拥塞反馈rtmp_to_rtc开启 RTMP 到 WebRTC 的转封装AAC 转 Opusrtc_to_rtmp开启 WebRTC 到 RTMP 的转封装dtls_role、dtls_versionDTLS 角色与版本。在 WebRTC 编码支持上SRS 自 v4.0.91 起支持 AV1仅 SFU 转发自 v7.0.123 起支持 VP9自 v7.0.124 起支持 G.711PCMU/PCMA可通过 URL 参数codecav1、codecvp9、acodecpcmu/pcma指定。协议转换直播与 WebRTC 的桥梁介绍文档特别强调 SRS 广泛支持互联网音视频协议间的转换例如RTMP/SRT → HLS / HTTP-FLV / WebRTC这是最常见的推流接入、多协议分发模式RTC → RTMP / HLS把 WebRTC 推流转换为传统直播协议供 RTMP/HTTP-FLV/HLS 播放或接入 FFmpeg 做混流后再分发。对应仓库中的现成配置conf/rtmp2rtc.confRTMP 转 WebRTC、conf/rtc2rtmp.confWebRTC 转 RTMP、conf/srt2rtc.confSRT 转 WebRTC、conf/srt2ts.confSRT 转 HTTP-TS等。以 RTMP 转 WebRTC 为例只需设置CANDIDATE后用-c conf/rtmp2rtc.conf启动 SRS即可用 FFmpeg 推 RTMP、用浏览器 WHEP 低延迟播放。可观测性与业务集成HTTP API、HTTP Callback 与 Prometheus ExporterSRS 为运维与业务定制提供了三层开放能力。HTTP API查询与管理 SRSSRS 提供一套自描述的 JSON HTTP API供外部系统查询系统与流状态。工作流为浏览器/业务应用 → HTTP API → SRS。仓库中 HTTP API 的路由实现位于 srs_app_http_api.cpp配置示例在 full.confhttp_api { enabled on; listen 1985; # 默认 1985full.conf 示例中为 8080 crossdomain on; # 支持浏览器跨域调用 auth { enabled on; type basic; # basic 或 bearer username admin; password admin; } https { enabled off; listen 1990; key ./conf/server.key; cert ./conf/server.crt; } }常用 API 一览详见 HTTP API 文档API说明/api/v1/versionsSRS 版本/api/v1/summaries系统摘要pid、argv、cpu、mem 等/api/v1/vhosts查询/管理 vhost/api/v1/streams查询/管理流支持?startNcountN分页/api/v1/clients查询/管理客户端连接DELETE /api/v1/clients/{id}踢掉指定客户端可从 streams API 的stream.publish.cid取 id/api/v1/raw?rpcreloadHTTP RAW API热加载配置等效killall -1 srs需开启http_api.raw_api错误以两种形式返回HTTP 非 200 状态码或 HTTP 200 但 body 中code非 0。SRS 5.0.152 / 6.0.40 起支持 Basic 与 Bearer 两种鉴权方式配置段http_api.auth仓库提供了现成示例 conf/http.api.auth.basic.conf 与 conf/http.api.auth.bearer.conf。HTTP Callback主动通知业务系统HTTP Callback 是 SRS 与业务系统集成、实现流鉴权与业务定制如动态 DVR的关键机制。当 FFmpeg/OBS 推流或播放时SRS 会 POST 事件到你的业务服务器-------- -------- ----------------------- | FFmpeg |---- SRS |--HTTP-Callback---- Your Business Server | -------- -------- -----------------------支持的事件包括on_publish推流开始、on_unpublish推流结束、on_play播放开始、on_stop播放结束、on_dvrDVR 切片、on_hlsHLS 切片与on_hls_notifyCDN 刷新通知。回调体为 JSON例如on_publish会携带action、client_id、ip、vhost、app、stream、param、server_id、stream_url、stream_id等字段若业务服务器返回非 0 的 code 或非 200 的 HTTP 状态SRS 会拒绝该客户端——这正是基于回调做推流鉴权如校验 URL 中的?tokenxxx的原理。示例配置见 conf/http.hooks.callback.conf文档还提供了 Go、Nodejs/Koa、PHP 三种语言的回调服务器示例。Prometheus Exporter云原生监控接入SRS 提供官方 Prometheus Exporter用于对接云原生监控体系Metrics Grafana 可视化。整体架构为----- ----------- --------- | SRS --Exporter---- Prometheus ---- Grafana ----- (HTTP) ----------- ---------配置段exporter默认监听 9972exporter { # 环境变量 SRS_EXPORTER_ENABLED默认 off enabled off; listen 9972; # 集群标识便于按机房/角色分类 label cn-beijing; tag cn-edge; }启用方式SRS 5.0.86./configure make env SRS_ENV_ONLYon SRS_EXPORTER_ENABLEDon SRS_LISTEN1935 ./objs/srs -ePrometheus 抓取http://localhost:9972/metrics后即可用 PromQL 查询码率等指标例如rate(srs_receive_bytes_total[10s])*8表示输入码率。详细步骤含 Prometheus 与 Grafana 的 docker 启动、数据源与 Dashboard 导入参见 Exporter 文档。此外介绍文档还提到 SRS 支持会话级可追踪日志session-level traceable logs用于大幅降低系统维护成本——每个客户端连接/会话拥有独立的上下文标识排查问题时可以沿着一条会话链路完整追踪其生命周期。技术实现ANSI C 98 与 ST 协程内核SRS 使用 ANSI C98编写只采用基础的 C 能力可在 Linux、Windows、macOS 上运行官方建议使用 Ubuntu 20 进行开发调试官方 Docker 镜像也基于 Ubuntu 20/focal 构建。面对流媒体处理中长连接 复杂状态机的难题SRS 采用STState Threads协程技术——一种类似 Go Goroutine 的 C 协程库——将阻塞式 IO 的编程范式与高并发结合起来。SRS 持续增强并维护 ST使其支持 Linux、Windows、macOS 及 X86_64、ARMv7、AARCH64、M1、RISCV、LOONGARCH、MIPS 等多种 CPU 架构。从源码看SRS 在 srs_app_st.cpp 中封装了协程抽象SrsFastCoroutine其构造函数注释明确0 use default, default is 64K协程栈默认 64KB见 srs_app_st.cpp启动时调用_pfn_st_thread_create(pfn, this, 1, stack_size_)创建 ST 协程srs_app_st.cpp。这套协程封装在协议层srs_protocol_st.cpp和应用层被广泛复用是 SRS 高并发低开销的根基之一。版本策略与里程碑SRS 约每两年发布一个大版本一年开发、一年稳定性打磨。官方给出如下版本分支建议developSRS 6.0 开发分支不稳定但新特性最多5.0releaseSRS 5.0当前稳定版本视分支状态而定4.0releaseSRS 4.0长期稳定分支。版本号体系对应三种标签-r为正式发布版如v4.0-r0、-b为相对稳定的公测版如v4.0-b0、普通版本号为不稳定开发版如v4.0.198此外还有比 beta 更不稳定的 alpha 版如v5.0-a0对应版本号v5.0.98。对 SRS 而言到达 beta 版本即可用于线上。仓库的 trunk/doc/CHANGELOG.md 分别记录了 SRS 6.0、SRS 5.0 与 SRS 4.0 的变更历史。另外注意个别功能会被标记为 Deprecated/Removed官方会在特性列表中说明移除原因。生态布局与社区治理SRS 的策略是不做客户端而是与 FFmpeg、OBS、VLC、WebRTC 等成熟社区协作把精力放在服务端与工具链上。围绕 SRS 的生态项目包括OryxSRS Stack开箱即用的单机视频云方案整合 FFmpeg 与 SRS面向不熟悉命令行的用户可通过云镜像或宝塔面板以鼠标操作搭建音视频应用WordPress-Plugin-SrsPlayer面向出版行业个人博客、媒体网站的播放器插件srs-unity面向游戏行业集成 Unity 的 WebRTC SDKsrs-bench支持 RTMP、FLV、WebRTC、GB28181 的音视频压测工具state-threads可视为 C 版的 Go 协程库小而强大持续演进tea探索用 eBPF 做弱网模拟与负载均衡。在质量保障上社区采用长期架构讨论如 HEVC 支持历经 7 年讨论、每个 PR 至少两名 TOC 与开发者 review 并跑通全部 CI、超过 500 个单元测试与约 60% 代码覆盖率、黑白盒测试、发布全流程流水线自动化等机制。SRS 是非商业开源社区欢迎任何人通过提交 Issue、贡献 PR 参与开发。进一步学习路径介绍文档为不同人群给出了明确的阅读建议音频视频与流媒体新手从 Getting StartedDocker 快速开始 入手实际推拉一路流建立直观感受想系统学习协议能力按 RTMP、SRT、HLS、HTTP-FLV、WebRTC 的顺序阅读想做业务集成精读 HTTP API 与 HTTP Callback想深入源码从 srs_app_st.cpp协程封装、srs_app_rtc_api.cppWHIP/WHEP 实现、srs_app_http_api.cppHTTP API 路由以及 full.conf全量配置注释出发。遇到问题时官方建议先查 FAQ再在社区搜索 Issue 与 Discussion——绝大多数问题都能在文档与历史讨论中找到答案。【免费下载链接】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),仅供参考