SRS(Simple Realtime Server)完整文档
本文档来自 zread.ai 对 ossrs/srs 仓库的解析,合并该站所有子页面内容。来源:https://zread.ai/ossrs/srs
目录
- 概述
- 快速开始
- [Docker 部署](#Docker 部署)
- 配置基础
- [RTMP 推流](#RTMP 推流)
- 最新动态
- 用户评价
- 关于团队
- 架构概览
- [RTMP 详解](#RTMP 详解)
- [HLS 实现](#HLS 实现)
- [WebRTC 技术栈](#WebRTC 技术栈)
- [SRT 协议](#SRT 协议)
- [GB28181 集成](#GB28181 集成)
- [FFmpeg 转码](#FFmpeg 转码)
- 边缘源站架构
- [录制与 DVR](#录制与 DVR)
- [HTTPS 与安全](#HTTPS 与安全)
- 性能调优
- [API 参考](#API 参考)
- 监控与指标
1. 概述
SRS(Simple Realtime Server)是一款专为实时流媒体应用设计的高性能开源视频服务器。作为全面的流媒体解决方案,SRS支持包括RTMP、WebRTC、HLS、HTTP-FLV、SRT、MPEG-DASH和GB28181在内的多种协议,使其成为各种流媒体场景的通用选择。
什么是SRS?
SRS是一款简单、高效、实时的视频服务器,使开发人员能够轻松构建强大的流媒体平台。它旨在处理视频流传输的复杂性,同时提供卓越的性能和灵活性。该服务器支持多种操作系统,包括Linux、Windows和macOS,并可在X86_64、ARMv7、AARCH64、Apple M1、RISCV、LOONGARCH和MIPS等多种CPU架构上运行。
SRS遵循MIT许可证,可免费用于商业和非商业用途,部分第三方库根据其各自许可证分发。
主要特性
SRS提供丰富的功能集,使其在流媒体服务器领域脱颖而出:
协议支持
- RTMP:全面支持实时消息传输协议,这是直播流传输的标准
- WebRTC:支持在Web浏览器中进行实时通信,具备发布和播放功能
- HLS:HTTP实时流传输,为各种设备提供自适应码率流
- HTTP-FLV:通过HTTP传输FLV流,实现低延迟播放
- SRT:安全可靠传输,在不可靠网络上实现高质量视频传输
- MPEG-DASH:HTTP动态自适应流传输,用于现代自适应流媒体
- GB28181:支持中国标准视频监控协议
系统能力
- 高性能:采用基于协程的状态线程架构,具有出色的并发性能
- DVR支持:将直播流录制为FLV或MP4文件,供后续播放
- 安全功能:基于IP的发布和播放操作允许/拒绝规则
- 虚拟主机:在单个服务器实例上支持多个虚拟主机
- 配置重载:无需重启服务器即可应用配置更改
- Docker支持:提供即用型Docker镜像,便于部署
高级功能
- 转码:通过FFmpeg集成在不同格式之间转换流
- 转发:将流分发到其他RTMP服务器
- 拉流:从各种来源拉取流并在SRS中提供
- 边缘-源站架构:支持可扩展的流媒体部署
- HTTP API:全面的系统管理和监控API
- HTTP回调:支持身份验证和与外部系统集成
架构概述
SRS采用模块化架构,能够高效处理各种流媒体协议和工作流程。该服务器作为中央枢纽,可以同时接收来自多个来源的流,并将其传递到不同的输出格式。
代码结构
SRS代码库被良好地组织成几个主要目录,每个目录都有特定用途:
- app/:包含主要应用程序逻辑,包括协议实现、服务器组件和功能模块
- core/:提供核心功能,包括性能监控、平台特定代码和版本管理
- kernel/:实现SRS的内核组件,包括状态线程系统和其他基础服务
- main/:包含主入口点和服务器初始化代码
- protocol/:处理SRS支持的各种流媒体协议的特定实现
- utest/:包含确保代码质量和功能的单元测试
这种模块化结构使开发人员更容易理解、扩展和维护代码库。
快速开始(概述)
使用SRS非常简单,特别是有了Docker支持。您只需一个命令即可运行SRS:
bash
docker run --rm -it -p 1935:1935 -p 1985:1985 -p 8080:8080 \
-p 8000:8000/udp -p 10080:10080/udp ossrs/srs:5
运行后,您可以:
- 打开 http://localhost:8080/ 验证服务器是否正常工作
- 使用FFmpeg向SRS推流:
ffmpeg -re -i ./doc/source.flv -c copy -f flv -y rtmp://localhost/live/livestream - 或使用OBS,设置服务器为:
rtmp://localhost/live,流密钥为:livestream - 使用各种播放器和协议播放流
社区与支持
SRS拥有活跃的社区,贡献者来自世界各地。该项目由在流媒体技术各个方面具有专业知识的专职团队维护。支持渠道包括:
- 中英文文档
- 社区论坛和讨论频道
- 通过赞助提供的商业支持选项
该项目鼓励贡献,并为希望参与开发的人员提供了明确的指导方针。
结论
SRS为任何希望实现实时视频流传输的人提供了一个强大、灵活的解决方案。其全面的协议支持、高性能和模块化架构使其适用于从简单直播到复杂视频分发网络的广泛应用。无论您是构建小规模流媒体解决方案还是大规模视频平台,SRS都能提供成功所需的工具和功能。
2. 快速开始
SRS (Simple Realtime Server) 是一款功能强大、高效的视频流服务器,支持 RTMP、WebRTC、HLS、HTTP-FLV、SRT 等多种协议。本指南将帮助您在几分钟内启动并运行 SRS,让您立即开始传输第一个视频。
准备工作
在开始之前,请确保您已具备:
- 系统中已安装 Docker
- 视频源(我们将提供选项)
- 用于测试的媒体播放器
使用 Docker 运行 SRS
使用 Docker 是启动 SRS 的最快方式,也是大多数用户推荐的方法。让我们用单个命令启动 SRS:
bash
docker run --rm -it -p 1935:1935 -p 1985:1985 -p 8080:8080 \
-p 8000:8000/udp -p 10080:10080/udp ossrs/srs:5
此命令暴露了 SRS 需要的基本端口:
- 1935:用于传入流的 RTMP 端口
- 1985:用于服务器管理的 HTTP API 端口
- 8080:用于 Web 播放器和 HLS 的 HTTP 服务器端口
- 8000/udp & 10080/udp:用于实时流媒体的 WebRTC 端口
如果您在中国,请使用 registry.cn-hangzhou.aliyuncs.com/ossrs/srs:5 以获得更快的下载速度。
容器运行后,您可以通过浏览器访问 http://localhost:8080/ 来验证 SRS 是否正常工作。您应该能看到 SRS 控制台页面,这表明服务器已准备好接收流。
了解 SRS 架构
在开始流媒体传输之前,让我们简要了解 SRS 的工作原理:SRS 作为一个中心枢纽,接收输入流并将其转换为多种输出格式。这种灵活性使您能够以最佳性能覆盖不同设备和网络的观众。
传输您的第一个视频
现在让我们向 SRS 传输视频。您有两个主要选择:
选项 1:使用 FFmpeg
如果您已安装 FFmpeg,可以使用 SRS 附带的示例视频文件:
bash
ffmpeg -re -i ./trunk/doc/source.flv -c copy -f flv -y rtmp://localhost/live/livestream
此命令:使用 SRS 仓库中的示例 FLV 文件;以实时速度传输(-re);复制编解码器而不重新编码(-c copy);将流发送到 SRS 的 rtmp://localhost/live/livestream。
选项 2:使用 OBS Studio
OBS Studio 是一款流行的免费直播工具。配置方法如下:
- 从 obsproject.com 下载并安装 OBS Studio
- 打开 OBS 并进入设置 > 推流
- 将服务设置为「自定义」
- 将服务器设置为 rtmp://localhost/live
- 将串流密钥设置为 livestream
- 点击「确定」,然后点击「开始推流」
播放您的流
流开始运行后,您可以通过多种方式播放:
Web 播放器(最简单)
VLC 播放器
- 打开 VLC 媒体播放器
- 进入媒体 > 打开网络串流
- 输入以下 URL 之一:RTMP
rtmp://localhost/live/livestream;HTTP-FLVhttp://localhost:8080/live/livestream.flv;HLShttp://localhost:8080/live/livestream.m3u8 - 点击「播放」
幕后工作原理
当您向 SRS 推流时,多个进程协同工作;SRS 自动处理格式之间的转换,使您的内容能够被观众访问,无论他们偏好的播放方式如何。
常见问题排查
如果遇到问题,可以进行以下快速检查:
- 容器无法启动:确保 Docker 正在运行且您有足够的权限
- 流无法连接:验证端口 1935 未被防火墙阻止
- 播放器无法加载:检查端口 8080 是否可访问且流处于活动状态
- WebRTC 无法工作:确保 UDP 端口 8000 和 10080 已开放
您可以通过运行 docker logs <容器ID> 检查 SRS 日志。
后续步骤
- 配置:通过修改配置文件自定义 SRS
- WebRTC:尝试使用 WebRTC 客户端进行实时流传输
- 安全:实施身份验证和访问控制
- 集群:设置多个 SRS 实例以实现可扩展性
- 监控:使用 HTTP API 监控流统计信息
SRS 的设计既强大又灵活,能够处理从简单的个人流到大规模专业部署的各种场景。
3. Docker 部署
Docker 部署是启动 SRS(简单实时服务器)最快的方式之一,只需最少的配置即可运行。本指南将带您了解如何使用 Docker 部署 SRS,从基础设置到高级配置,确保您能在几分钟而非几小时内开始流媒体传输。
为什么选择 Docker 部署 SRS?
Docker 通过将 SRS 及其所有依赖项打包到标准化容器中,简化了部署过程。这种方法消除了兼容性问题,将设置时间从可能需要的几小时缩短到仅需几分钟。使用 Docker,您可以在不同环境中一致地运行 SRS------无论您是在 macOS 上开发,在 Linux 服务器上部署,还是在 Windows 机器上工作。
官方 SRS Docker 镜像已预配置支持所有主流流媒体协议,包括 RTMP、WebRTC、HLS、HTTP-FLV、SRT 等。这意味着您可以立即开始尝试实时流媒体传输,而无需担心复杂的安装过程或依赖冲突。
快速开始:在 Docker 中运行 SRS
打开终端并执行:
bash
docker run --rm -it -p 1935:1935 -p 1985:1985 -p 8080:8080 \
-p 8000:8000/udp -p 10080:10080/udp ossrs/srs:5
此命令:--rm 在容器停止时自动删除容器;-it 以交互模式运行并分配终端;-p 将容器端口映射到主机。在中国可使用镜像 registry.cn-hangzhou.aliyuncs.com/ossrs/srs:5 加速下载。容器运行后,在浏览器打开 http://localhost:8080/ 验证安装。
理解端口映射
- 1935:RTMP 流入
- 1985:HTTP API 管理
- 8080:Web 播放器与 HLS
- 8000/udp、10080/udp:WebRTC
测试您的 SRS 部署
使用 FFmpeg:
bash
ffmpeg -re -i ./doc/source.flv -c copy -f flv -y rtmp://localhost/live/livestream
使用 OBS Studio: 设置 > 流 > 服务「自定义」,服务器 rtmp://localhost/live,串流密钥 livestream。
播放: RTMP rtmp://localhost/live/livestream;HTTP-FLV http://localhost:8080/live/livestream.flv;HLS http://localhost:8080/live/livestream.m3u8。
默认 Docker 配置
Docker 配置将日志定向到控制台(srs_log_tank console; daemon off;),便于使用 docker logs 查看。默认启用 RTMP(1935)、http_api(1985)、http_server(8080)、rtc_server(8000),其中 $CANDIDATE 用于 WebRTC NAT 穿透。
高级 Docker 配置
自定义配置文件挂载:
bash
docker run --rm -it -p 1935:1935 -p 1985:1985 -p 8080:8080 \
-p 8000:8000/udp -p 10080:10080/udp \
-v /path/to/your.conf:/usr/local/srs/conf/custom.conf \
ossrs/srs:5 ./objs/srs -c conf/custom.conf
录制持久化: -v /path/to/recordings:/usr/local/srs/recordings
环境变量: -e CANDIDATE="your.server.public.ip" 用于 WebRTC;-e SRS_DAEMON=off 等。
构建自己的镜像
bash
docker build -t my-srs:latest -f Dockerfile .
Dockerfile 采用多阶段构建;可使用 --build-arg CONFARGS="--with-ssl --with-hls" 等自定义构建。
Docker Compose 生产部署
示例 docker-compose.yml:映射端口 1935/1985/8080/8000/10080,挂载 ./conf 与 ./recordings,设置 CANDIDATE,restart: unless-stopped。可扩展为 srs-origin + srs-edge 源站-边缘架构。
监控与管理
- 日志:
docker logs -f <容器名> - 健康:
docker ps查看 STATUS - 资源:
docker stats <容器名> - HTTP API:
curl http://localhost:1985/api/v1/summaries - Web 控制台:http://localhost:8080/
常见问题
- 端口冲突:改用不同主机端口或
lsof -i :1935排查 - 权限:确保挂载目录权限或
--user $(id -u):$(id -g) - WebRTC:正确设置
CANDIDATE,开放 UDP 8000/10080 - 内存:
--memory="1g"或使用轻量配置
4. 配置基础
SRS 使用灵活的配置系统,配置文件采用分层结构(节与参数)。主配置通常位于 trunk/conf/srs.conf,完整参考见 trunk/conf/full.conf。语法:parameter value;、节用花括号、注释以 # 开头。
全局配置
顶层定义:max_connections、daemon、pid、srs_log_tank(file/console)、srs_log_file、srs_log_level。
服务配置
- RTMP :
rtmp { listen 1935; chunk_size 60000; },可多端口如listen 1935 [::]:1935 192.168.1.100:1935; - HTTP API :
http_api { enabled on; listen 1985; crossdomain on; },可启用 HTTPS 与 auth - HTTP 服务器 :
http_server { enabled on; listen 8080; dir ./objs/nginx/html; },用于 HLS、HTTP-FLV 等
虚拟主机(vhost)
vhost __defaultVhost__ { ... } 为默认 vhost;可定义多个 vhost(如 live.example.com)。vhost 内可配置:
- play :
gop_cache、gop_cache_max_frames、queue_length、time_jitter、mw_latency - publish :
mr、mr_latency、firstpkt_timeout、normal_timeout、parse_sps - http_remux :HTTP-FLV/TS/MP3/AAC 挂载与
mount模式 - hls :
hls_path、hls_fragment、hls_window - srt (vhost 内)/ srt_server (全局):
listen、maxbw、passphrase、pbkeylen等 - rtc (WebRTC):
rtc_server { listen 8000; candidate $CANDIDATE; },vhost 内rtc { rtmp_to_rtc; rtc_to_rtmp; }
环境变量与重载
环境变量格式 SRS_SECTION_PARAMETER(如 SRS_RTMP_LISTEN)。验证:./objs/srs -t -c conf/srs.conf;重载:HTTP API curl http://localhost:1985/api/v1/reload 或 killall -1 srs;可开启 inotify_auto_reload on。
5. RTMP 推流
SRS 中 RTMP 采用模块化架构:连接管理、协议栈(握手、分块、消息)、媒体处理、虚拟主机。默认监听 1935,可多端口。URL 格式:rtmp://server:port/app/stream_name。
基础配置
最低配置:rtmp { listen 1935; }、vhost __defaultVhost__ {},启动:./objs/srs -c conf/rtmp.conf。推流示例:ffmpeg -re -i input.mp4 -c copy -f flv rtmp://localhost:1935/live/stream1;播放:ffplay rtmp://localhost:1935/live/stream1。
高级配置
- chunk_size:如 60000 可提升性能,需客户端支持。
- vhost 低延迟 :
min_latency on、tcp_nodelay on、play { gop_cache off; queue_length 10; }、publish { mr off; }。 - RTMPS :
rtmps { enabled on; listen 1443; key ...; cert ...; },证书可用 OpenSSL 生成。 - 性能优化 :
gop_cache on、gop_cache_max_frames、queue_length、mw_latency、mr/mr_latency;max_connections、firstpkt_timeout、normal_timeout、kickoff_for_idle。 - 时间戳 :
play { time_jitter full|zero|off; atc off; mix_correct off; }。
6. 最新动态
SRS 在 2025 年发展势头强劲,7.0(代号 Kai)带来重大架构演进:内存管理从手动转向共享指针(SrsSharedPtr、SrsMemoryBlock),统一媒体数据包为 SrsMediaPacket;全协议 IPv6 支持(RTMP、HTTP/HTTPS、WebRTC、SRT、RTSP);SRT/RTC 服务器整合进主 SrsServer,协议统一。行业将 SRS 与 OvenMediaEngine、Nimble Streamer 并列,强调低延迟与多协议(含 WHIP/WHEP)。技术方面:保持 C++98 兼容、移除 Cygwin;流发布令牌系统防跨协议竞争;基于 CPU 的熔断机制保障高负载稳定。社区由 ossrs.io 提供商业支持,团队包括 WebRTC/SRT、GB28181、H.265 等方向专家。
7. 用户评价
SRS 自 2013 年起获得全球开发者与流媒体专业人士的广泛反馈。生产案例:求知播、欧洲 BEGINHO STREAMING PROJECT、丽江电视台、又拍云等将 SRS 用于多节点 HLS、源站-边缘转发、云直播等,强调配置简单与长期稳定。性能上用户反馈与 nginx-rtmp 相比资源利用效率高、稳定性好;文档获好评。社区 2023 年付费用户与订阅者显著增长,海外付费支持反响良好;项目承诺将部分收入捐赠 FFmpeg、OBS 等。改进方向包括 API 响应时间与 CPU 峰值优化、ASan 下内存分析等;项目持续在内存管理与媒体包统一等方面迭代。用户评价 SRS 为「高端专业产品」,在专业流媒体领域具备竞争力。
8. 关于团队
SRS 始于 2013 年北京,现为全球协作项目。创始人杨成立(Winlin)拥有超过 15 年直播与 WebRTC 经验,现于 Twitch 工作,主导架构与状态线程(ST)技术,项目从约 8,287 行发展至逾 17 万行。核心成员:肖志宏(John)--- WebRTC/QUIC/SRT、腾讯贡献者;陈海波(Haibo Chen)--- GB28181、HTTP API、WHIP 等;石伟 --- SRT、H.265、FFmpeg 补丁;夏立新(Louis Xia)--- GB28181、直播与 WebRTC。贡献者还包括张俊钦(H.265、Prometheus、API)、陈光华(WebRTC/QoS、ASan)、李鹏(WebRTC、内存与智能指针)等。社区通过 Discord 提供支持,赞助档位:支持者 5 美元/月、赞助者 100 美元/月;OpenCollective 已获逾 1.1 万美元。愿景:非营利开源社区,协助全球开发者构建高质量流媒体与 RTC 平台。
9. 架构概览
SRS 采用模块化、分层架构,围绕状态线程(ST)模型实现高并发。输入层 :RTMP 编码器(OBS、FFmpeg 等)、WebRTC 客户端、媒体源(FFmpeg 拉 RTSP/文件/HTTP/HLS)、SRT 模块,各由专门组件转为内部格式。处理核心 :流处理(解析、校验)、协议转换、可选 FFmpeg 转码;状态线程采用协作多任务,减少上下文切换与内存占用。输出层 :DASH、RTMP/HDS、HLS/HTTP、FLV/MP3/AAC/TS、WebRTC、转发、DVR;带宽测试与 EXEC 钩子。管理层:HTTP API(RESTful 控制与监控)、配置热重载、内置指标。设计原则:模块化、高性能、协议无关、可扩展(单节点与集群)。支持 Linux(x86/ARM)、macOS、Windows(Docker)及 RISCV、LOONGARCH、MIPS 等。
10. RTMP 详解
SRS 将 RTMP 作为主要接入协议,支持数千并发、低延迟。配置:rtmp { listen 1935; },vhost 内可设 chunk_size、in_ack_size、out_ack_size、min_latency、tcp_nodelay。发布 :publish { mr, mr_latency, firstpkt_timeout, normal_timeout, parse_sps, kickoff_for_idle }。播放 :play { gop_cache, gop_cache_max_frames, queue_length, time_jitter, atc, mw_latency, mw_msgs, reduce_sequence_header }。安全 :vhost 内 play/publish { allow/deny IP; };RTMP over TLS 使用 listen 443 ssl 与 ssl { key; cert; }。架构基于状态线程、协程、零拷贝与异步 I/O。性能:chunk_size 权衡延迟与吞吐;MR/MW 合并 I/O;GOP 缓存加速起播。转发:forward { destination ... }。监控:/api/v1/summaries、/api/v1/streams/。排错:调整 firstpkt_timeout/normal_timeout、queue_length、time_jitter、gop_cache_max_frames、mr 等。
11. HLS 实现
HLS 将流切分为 .ts 或 .m4s 片段与 M3U8 播放列表。vhost 内 hls { enabled on; hls_path ...; hls_fragment 10; hls_window 60; hls_recover on; }。可选:hls_use_fmp4 on(FMP4 比 TS 更省空间);hls_fragment/hls_window/hls_td_ratio/hls_aof_ratio;文件命名模式 hls_m3u8_file、hls_ts_file、hls_fmp4_file、hls_init_file(支持 [app]/[stream]/[seq] 等变量)。高级:hls_recover 保持序列号便于断线续播;hls_keys on、hls_fragments_per_key、hls_key_file、hls_key_url 实现 AES-128 加密;hls_cleanup、hls_dispose 自动清理;hls_ctx/hls_ts_ctx 会话跟踪与回调;hls_on_error ignore|disconnect|continue;hls_wait_keyframe on 与关键帧对齐;hls_ts_floor、hls_dts_directly。HLS 文件由内置 http_server 或外部 NGINX 提供。
12. WebRTC 技术栈
SRS 将 WebRTC 同时作为输入与输出,与 RTMP/HLS 等并列,实现 RTMP↔WebRTC 双向转换。架构:SrsRtcServer(UDP 入口)、SrsRtcSessionManager、SrsRtcConnection;SDP(SrsSdp)、DTLS、RTP/RTCP(NACK、抖动缓冲)完整支持。配置:rtc_server { enabled on; listen 8000; candidate $CANDIDATE; },vhost 内 rtc { rtmp_to_rtc on; rtc_to_rtmp on; }。可调 recv_buffer_size/send_buffer_size。用例:低延迟直播(亚秒级)、视频会议 SFU、RTMP 与 WebRTC 协议桥接、IoT/设备直连浏览器。
13. SRT 协议
SRT(安全可靠传输)在不可靠网络上提供加密、自动重传与低延迟。SRS 中通过 srt_server { enabled on; listen 10080; maxbw; connect_timeout; peerlatency/recvlatency/latency; sendbuf/recvbuf; } 与 vhost 内 srt { srt_to_rtmp on; } 配置。实现:SrsSrtSocket(连接、收发、事件)、ISrsSrtPoller 轮询多连接、SrsSrtStat 统计(收发/丢包/重传)。推流示例:ffmpeg ... -f mpegts "srt://srs-server:10080?streamid=live/stream"。可与 rtc、http_remux 等组合实现 SRT→RTMP/WebRTC/HLS 多协议分发。
14. GB28181 集成
GB28181 为中国视频监控国标,基于 SIP(信令)与 RTP(媒体)。SRS 作为 GB28181 平台:注册设备、接收 RTP/PS 流并转为 RTMP 等。实现类:SrsGbSession、SrsGbSipTcpConn、SrsGbMediaTcpConn、SrsGbMuxer。配置:stream_caster { caster gb28181; output rtmp://127.0.0.1/live/[stream]; listen 9000; sip { enabled on; listen 5060; candidate $CANDIDATE; } };仅媒体模式可 sip { enabled off; }。媒体管道:PS 解复用、帧重组、H.264/H.265+AAC 转 RTMP、时间戳校正。外部 SIP 集成:POST /gb/v1/publish/ 返回媒体端口。启动:./objs/srs -c gb28181.conf,流可用 RTMP/HTTP-FLV/HLS。支持连接池、缓冲与错误恢复,单机可支撑数百并发会话。
15. FFmpeg 转码
SRS 通过调用外部 FFmpeg 进程实现转码:拦截输入流 → 启动 FFmpeg → 将输出推回 SRS。vhost 内 transcode { enabled on; ffmpeg ./objs/ffmpeg/bin/ffmpeg; engine name { enabled on; vcodec libx264; vbitrate/vwidth/vheight; vprofile/vpreset/vthreads; vfilter {}; acodec libfdk_aac; abitrate; output rtmp://127.0.0.1:[port]/[app]/[stream]_[engine]?vhost=[vhost]; } }。可配置多 engine(如 hd/sd、240p/360p/720p)做多码率;vfilter 支持 scale、fade 等;纯音频可用 vcodec vn;硬件编码如 vcodec h264_nvenc。进程由 SrsFFMPEG 管理(启动、监控、重启、退出)。可开启 ff_log_enabled/ff_log_dir 记录 FFmpeg 日志。
16. 边缘源站架构
源站(Origin)接收编码器推流,边缘(Edge)从源站拉流并分发给观众。源站配置:rtmp { listen 19350; }、http_server、http_remux。边缘配置:vhost { cluster { mode remote; origin 127.0.0.1:19350; } }、http_remux 等。观众请求边缘时,边缘按需向源站拉流。高可用:源站集群 cluster { mode local; origin_cluster on; coworkers ip:port ... },边缘可配置多源站 origin ip1:port ip2:port 做冗余与负载均衡。监控通过 HTTP API 查看状态、连接与带宽。
17. 录制与 DVR
SRS DVR 将 RTMP 流录制成 FLV 或 MP4。vhost 内 dvr { enabled on; dvr_path ./objs/nginx/html/[app]/[stream].[timestamp].mp4; dvr_plan session|segment; }。会话录制 (dvr_plan session):从推流开始到结束一个文件。分段录制 (dvr_plan segment):dvr_duration 30(秒)、dvr_wait_keyframe on 按关键帧切分。路径支持变量 [vhost]、[app]、[stream]、[2006]/[01]/[02]/[15]/[04]/[05]/[999]、[timestamp]。高级:time_jitter full|zero|off;dvr_apply all 或 app/stream 限定录制对象。http_hooks { on_dvr http://...; } 在完成录制时回调,便于后处理、上传或入库。
18. HTTPS 与安全
SRS 支持对 HTTP 服务器与 HTTP API 启用 HTTPS(SSL/TLS)。http_server { https { enabled on; listen 8088; key ...; cert ...; } },http_api { https { ... }; auth { enabled on; username; password; } }。RTMPS:rtmps { enabled on; listen 1443; key ...; cert ...; }。访问控制:vhost 内 security { deny publish all; allow publish 192.168.1.0/24; allow play all; }。回调可使用 HTTPS:http_hooks { on_publish/on_unpublish/on_play/on_stop https://...; }。证书:生产环境使用 CA 签发证书,自签名仅用于测试;可用 openssl req -new ... 生成 CSR。
19. 性能调优
性能受网络、CPU、内存、磁盘 I/O、协议开销影响。全局:max_connections、chunk_size 60000(较默认 128 可提升约 10%)、tcmalloc_release_rate。低延迟 :vhost min_latency on、tcp_nodelay on;play { gop_cache off; queue_length 10; mw_latency 0; mw_msgs 0; }、publish { mr off; }。高并发 :play { gop_cache on; queue_length 30; mw_latency 500; mw_msgs 16; }、publish { mr on; mr_latency 500; }。熔断 :circuit_breaker { high_threshold 80; dying_threshold 99; }。HLS:hls_ctx off、hls_ts_ctx off 利于 CDN 缓存。监控:exporter { enabled on; listen 9972; } 暴露 Prometheus 指标。可用 srs-bench 做压测。
20. API 参考
SRS 提供 RESTful HTTP API(默认端口 1985),返回 JSON,支持 JSONP。基础 URL:http://server:1985/api/。响应含 code(0 成功,非零错误)。常用端点:GET /api/v1/versions 版本信息;GET /api/v1/summaries 服务器摘要(uptime、cpu_usage、memory、connections、streams);GET /api/v1/rusages 资源使用详情;GET /api/v1/streams 流列表(可选 start、count 分页);GET /api/v1/streams/{id} 单流详情;GET /api/v1/vhosts、/api/v1/vhosts/{id} 虚拟主机;GET /api/v1/clients 客户端列表;GET /api/v1/raw 原始配置与重载。WebRTC:/rtc/v1/play、POST /rtc/v1/publish、/rtc/v1/nack。错误码如 ERROR_RTMP_VHOST_NOT_FOUND、ERROR_RTMP_STREAM_NOT_FOUND 等。
21. 监控与指标
监控 SRS 对维持最佳性能、提前发现问题、保障流媒体基础设施可靠性至关重要。SRS 通过内置 HTTP API、Prometheus 集成和心跳机制提供全面监控能力。
为什么监控很重要
- 在影响流质量前发现性能瓶颈
- 跟踪资源利用率以优化容量
- 识别可能的安全异常
- 按使用趋势做容量规划
- 借助详细指标快速排障
HTTP API 监控
在配置中启用 http_api 与 raw_api:
bash
http_api {
enabled on;
listen 1985;
raw_api {
enabled on;
allow_reload on;
}
}
通过 http://your-server:1985/api/v1/ 访问:服务器统计(连接数、带宽、系统资源)、流信息(活跃流、发布者/订阅者)、虚拟主机详情、系统指标(CPU、内存、网络)。示例:curl http://localhost:1985/api/v1/summaries。raw_api 支持热重载配置。
Prometheus 集成
配置 exporter 启用指标导出:
bash
exporter {
enabled on;
listen 9972;
label cn-beijing;
tag cn-edge;
}
端口 9972 暴露 Prometheus 格式指标;label、tag 用于区分多实例。指标地址:http://your-server:9972/metrics。Prometheus 抓取示例:
yaml
scrape_configs:
- job_name: 'srs'
static_configs:
- targets: ['srs-server:9972']
labels:
instance: 'srs-edge-1'
可配合 Grafana 做仪表板与告警。
心跳监控
分布式部署下可配置心跳,定期向中心 API 上报状态:
bash
heartbeat {
enabled on;
interval 9.3;
url http://127.0.0.1:8085/api/v1/servers;
device_id "my-srs-device";
summaries on;
}
interval 为上报间隔(秒),url 为接收端点,device_id 为实例唯一标识,summaries on 包含性能摘要。建议生产环境间隔约 10--30 秒。
系统资源监控
在 stats 中配置网络与磁盘监控:
bash
stats {
network 0;
disk sda sdb xvda xvdb;
}
可观测:网络接口统计、磁盘 I/O 与空间、CPU 与内存。指标经 HTTP API 与 Prometheus 暴露,便于做容量规划与瓶颈分析。
需要监控的关键指标
- 连接:活跃连接数、发布者/流数、订阅者数、连接速率
- 性能:带宽、CPU、内存、磁盘 I/O(DVR/HLS)
- 流质量:帧率、比特率、丢帧、缓冲区
- 系统健康:负载(1/5/15 分钟)、网络错误、磁盘空间、文件描述符
设置监控仪表板
- 配置 Prometheus 抓取 SRS(exporter 端口 9972)
- 在 Grafana 中添加 Prometheus 数据源
- 为关键指标创建面板与告警
生产建议:多级告警(如 80% 警告、90--95% 严重)、仪表板模板、自动化响应脚本、基于历史的容量规划。
SRS 监控最佳实践
- 从基本指标入手:连接数、流数、带宽、CPU/内存、错误率
- 设合理阈值:警告约 80%、严重约 90--95%,结合趋势告警
- 多层级监控:应用(SRS)、系统、网络、端到端流质量
- 自动化响应:扩缩容、负载均衡、故障转移、异常重启
- 定期复盘:减少误报/漏报、补充指标、调整保留策略、更新仪表板