用Docker部署SRS流媒体服务器:从RTMP到WebRTC的完整实践
说实话我最早接触 SRS 是在一个监控项目上当时要在服务器上编译安装依赖库装了一堆中间还因为 glibc 版本问题折腾了大半天。后来换成了 Docker 部署 SRS从拉镜像到推拉流成功前后不超过五分钟。自此以后我在所有项目里都用容器化方案跑 SRS再也没碰过裸机编译。SRSSimple Realtime Server是目前开源社区里非常活跃的流媒体服务器天然支持 RTMP、HLS、WebRTC、SRT、HTTP-FLV 等主流协议。配合 Docker 使用能快速在本地或云服务器上搭建一套完整的实时音视频直播平台支持摄像头 RTSP 转直播、OBS 推流、WebRTC 低延迟连麦、HLS 点播回放等场景。这篇内容适合刚接触流媒体的新手也适合想快速验证业务逻辑的团队参考。1. 为什么用 Docker 跑 SRS方案选型的底层逻辑1.1 SRS 的协议栈到底强在哪里先说一个我拿 SRS 做项目的直观感受它不是一个“只能推 RTMP 流”的玩具服务器而是一个覆盖音视频接入、转封装、分发全过程的集成式服务。比如某个项目中前端需要低延迟直播我直接接入 WebRTC 播放另一个业务要兼容 iOS Safari又把 HLS 同时开起来。一套 SRS 服务全部兜住完全不用再单独部署其他组件。从协议支持上看SRS 支持 RTMP、RTSP、HTTP-FLV、HLS、WebRTC、SRT、GB28181 等多种接入和播放协议。其中 RTMP 是直播推流的主流协议OBS、FFmpeg 都原生支持HLS 则天然适配移动端和普通 Web 播放器WebRTC 则能把延迟压到 500ms 以内适合连麦和视频会议场景。正是这种“多协议握手”的能力让它能独立承担一整条直播链路的源头服务。1.2 Docker 化部署解决了哪些传统痛点用 Docker 跑 SRS最大的收益不是省掉了编译时间而是把“环境一致性”这个隐藏成本直接抹掉了。早些年我在 CentOS 7 上编译 SRS要手动装 gcc、make、pcre-devel、openssl-devel 等一堆依赖中途还要处理 EPEL 源偶尔抽风的问题。一旦换一台服务器哪怕系统版本一模一样也可能因为某个库版本不一致而编译失败。这类重复劳动对业务来说完全是纯消耗。Docker 方案把 SRS 及其依赖封装成镜像启动就是完整运行时彻底绕开了服务器系统差异。我实际测试过同一份ossrs/srs:5镜像在 Ubuntu 22.04、Debian 12、CentOS Stream 9 上跑出来的行为完全一致这在排查跨环境问题时非常省心。另外 Docker 带来的还有版本回滚能力升级 SRS 时先 pull 新镜像启动测试有问题随时切回旧容器整个回滚过程秒级完成。1.3 何时不建议用 Docker 部署 SRS这不是劝退而是给你排雷。如果你的服务器本身资源极其紧张比如只有 256MB 内存的极小 VPS或者有非常底层的网络调优需求比如自定义内核参数、绑定网卡队列那裸机部署可能更合适。但绝大多数场景下Docker 的资源开销可以忽略不计。还有一种情况是团队已经有成熟的裸机运维体系比如用 systemd 管服务的习惯根深蒂固强行引入 Docker 反而增加学习成本这时才需要权衡。2. 部署前必做准备Docker 环境与镜像源配置2.1 安装 DockerWindows 与 Linux 双路线如果你本机是 Windows建议直接用 Docker Desktop。它自带图形化管理界面资源占用相较于虚拟机方案低很多。安装流程很常规装好后在 Settings 里把 WSL 2 后端选上就行。需要注意一点Docker Desktop 若未启动后续所有docker命令都会报连接失败所以每次用之前先确认小鲸鱼图标在正常运行。Linux 服务器上安装则推荐用官方脚本CentOS、Ubuntu 均适用。执行完安装脚本后把当前用户加入 docker 组否则每次执行 docker 命令都要加sudo非常影响效率。命令如下curl -fsSL https://get.docker.com | bash sudo usermod -aG docker $USER重新登录终端后执行docker version确认安装成功。2.2 镜像拉取慢配置可靠镜像源这是被问得最多的一个问题。平时docker pull ossrs/srs:5时默认从 Docker Hub 拉取网络波动或延迟都会导致超时。常规思路是给 Docker 配置镜像源。这里直接说配置方法Linux 下编辑/etc/docker/daemon.json没有就新建Windows/Docker Desktop 则在 Settings - Docker Engine 里改同样的 JSON 内容{ registry-mirrors: [ https://docker.m.daocloud.io, https://dockerproxy.com, https://docker.mirrors.ustc.edu.cn ] }保存后重启 Docker 服务Linux 执行sudo systemctl restart docker。配置完成后重新拉镜像速度体感会快不少。但我必须提醒一句公共镜像源的稳定性无法保证如果某天发现一个源失效换列表里另一个即可。项目真实上线阶段有条件就把镜像同步到私有仓库这才是根治方案。2.3 端口规划哪些端口是必须的SRS 涉及的端口比较多部署前先规划好能避免很多冲突。SRS 5 的最低端口集合如下端口协议用途1935TCPRTMP 推流与拉流8080TCPHTTP-FLV、HLS、WebRTC 播放与访问 API1985TCPHTTP API查询服务器状态8000UDPWebRTC 媒体传输如果只是先跑通 RTMP 推流和 HLS 播放1935 和 8080 就够用了。但既然上了 Docker建议把这些端口一次性映射好省得后面想玩 WebRTC 时再回来改配置。3. 五分钟跑通Docker 部署 SRS 完整实操3.1 拉镜像并启动容器确保 Docker 就绪后先拉取 SRS 5 的官方镜像这是当前最推荐的稳定版本docker pull ossrs/srs:5镜像拉取完成后直接启动容器。下面这条命令覆盖了 RTMP、HTTP、API 和 WebRTC 端口的映射docker run -d --name srs \ -p 1935:1935 \ -p 8080:8080 \ -p 1985:1985 \ -p 8000:8000/udp \ ossrs/srs:5启动后执行docker ps看到状态为 Up 就算成功。如果看到端口被占用用docker logs srs查看日志一般会直接提示是 bind 失败还是启动故障。3.2 验证服务访问 HTTP API 与自带控制台容器启动后怎么确认 SRS 真的在正常工作最直接的方法是请求它的 HTTP API 接口curl http://localhost:1985/api/v1/versions正常情况下会返回一段包含版本号、服务标识的 JSON 字符串这代表 API 服务已经就绪。接着在浏览器中访问http://localhost:8080/players/srs_player.html这是 SRS 自带的播放器测试页。能打开这个页面说明静态资源服务和 HTTP 服务都正常了。3.3 从推流到播放体验真实直播链路服务跑起来了现在进入最有成就感的环节推流和播放。先用 OBS 推流。打开 OBS进入设置 - 直播服务选“自定义”服务器地址填rtmp://localhost:1935/live推流码填livestream。然后开始推流这相当于把直播画面推给了 SRS。接着打开 SRS 自带播放器测试页在播放地址栏输入rtmp://localhost:1935/live/livestream如果一切正常画面几乎瞬间就能出来。我还习惯顺手测一下 HLS 线路把播放地址换成http://localhost:8080/live/livestream.m3u8浏览器直接访问这个 m3u8 地址能播放就代表 HLS 走通了。这时你已经具备了一套完整的直播系统雏形整个过程不超过五分钟。4. 从体验到生产docker-compose 编排与配置详解4.1 用 Docker Compose 固化部署环境一个人玩的时候docker run 敲几次没问题但项目要交付或上生产就必须把部署过程变成“文档化、可版本管理”的形式。Docker Compose 是我在这个阶段的首选工具。它的好处是把端口映射、数据卷、环境变量、重启策略全部写进一个 YAML 文件团队里任何人拿到文件都能一键拉起完全一致的环境。下面是我常用的一份docker-compose.yml模板version: 3.8 services: srs: image: ossrs/srs:5 container_name: srs-app restart: always ports: - 1935:1935 - 8080:8080 - 1985:1985 - 8000:8000/udp volumes: - ./srs.conf:/usr/local/srs/conf/srs.conf - ./data:/usr/local/srs/objs environment: - TZAsia/Shanghai这里有两个细节值得说明。一个是restart: always服务器重启后容器会自动拉起省去手动干预另一个是挂载./data:/usr/local/srs/objsSRS 的 HLS 切片、DVR 录制文件都保存在这个目录下挂载到宿主机后数据不会因为容器删除而丢失。在项目目录下执行docker compose up -d看到 “Started” 状态就完成了。以后想升级改掉镜像版本号再docker compose up -d即可。4.2 SRS 配置文件的常见模块解读SRS 默认配置在/usr/local/srs/conf/srs.conf里面核心模块要能看懂才能应对不同场景的定制需求。先说监听配置listen 1935; max_connections 1000;listen指定 RTMP 的服务端口max_connections限制并发连接数。如果你的服务面向公网这个值要根据服务器带宽和内存来定不建议盲目加大。接着是 HTTP 模块http_api { enabled on; } http_server { enabled on; listen 8080; }http_api开启后外部可以通过 1985 端口查询服务器状态、踢人、获取流列表等信息很适合对接运维系统。http_server用来托管 HLS 文件和 Web 播放器页面所以 HLS 播放依赖它。然后是 vhost 配置。SRS 里 vhost 类似 Nginx 的 server 块可以为不同的域名或业务配置不同策略。默认配置里有一个__defaultVhost__代表所有未匹配域名的流都走这里vhost __defaultVhost__ { hls { enabled on; } }在这个 vhost 块里开启了 HLSSRS 会把 RTMP 流转封装成 HLS 切片并生成 m3u8 索引文件。HLS 通常还要配套设置分片时长和窗口大小hls { enabled on; hls_path ./objs/nginx/html; hls_fragment 5; hls_window 30; }hls_fragment是每个切片文件的时长单位秒hls_window是播放窗口总时长。切片越短延迟越低但切片文件越多对磁盘 IO 的要求也越高。直播场景我一般设置 5 秒切片、30 秒窗口兼顾延迟和稳定性。4.3 自定义配置加鉴权、开 WebRTC 与 HLS默认配置只是“能用”真实项目里肯定要动刀。先说最实用的鉴权。SRS 支持在播放和推流时校验密钥防止任何人都能推拉流。在 vhost 块里加入vhost __defaultVhost__ { play { secret your_play_secret; } publish { secret your_publish_secret; } }这样配置后拉流地址必须带?secretyour_play_secret才能播放推流地址同理。实际使用中这个密钥最好由后端服务生成并配合时间戳做短期有效避免长期暴露在抓包环境中。再来说 WebRTC。默认配置下 SRS 是没有开启 WebRTC 的需要显式配置 rtc_server 模块rtc_server { enabled on; candidate $CANDIDATE; }candidate是你的服务器公网 IP 或域名。注意如果服务器在 NAT 后面这一步必须正确配置否则 WebRTC 协商阶段会直接失败表现为媒体流始终处于“connecting”状态。完整配置示例参考listen 1935; max_connections 1000; daemon off; srs_log_tank console; http_api { enabled on; } http_server { enabled on; listen 8080; dir ./objs/nginx/html; } rtc_server { enabled on; candidate your.public.ip; } vhost __defaultVhost__ { hls { enabled on; hls_path ./objs/nginx/html; hls_fragment 5; hls_window 30; } play { secret your_play_secret; } publish { secret your_publish_secret; } }这份配置已经能覆盖绝大多数中小直播业务自测足够上线也能顶一阵。5. 进阶玩法与生态联动5.1 用 FFmpeg 把视频文件变成直播流除了 OBS 推流另一个高频场景是把本地视频文件模拟成实时直播流。刚好 SRS 生态里最常用的搭档就是 FFmpeg。FFmpeg 可以用-re参数按帧率真实读取文件并推送命令如下ffmpeg -re -i ./movie.mp4 -c copy -f flv rtmp://localhost:1935/live/movie-re很关键它让 FFmpeg 以原始帧率读取文件模拟摄像头实时输出的效果。如果不加FFmpeg 会以最快速度推完整个文件直播画面秒变快进。这个玩法适合做 24 小时直播频道、影视轮播、宣传片循环等场景。后期如果想让视频循环推送套一层 shell 循环脚本即可。5.2 接入 WebRTC低延迟播放与连麦如果业务对延迟有硬性要求比如在线答题、远程指导、互动连麦WebRTC 是绕不开的方向。SRS 5 对 WebRTC 的支持已经相当成熟其中rtc_server完成媒体传输信令部分可以由自研后端或对接现成信令服务实现。WebRTC 拉流地址格式为webrtc://your.domain:8080/live/livestream对应的播放器可以用 SRS 自带的srs_player.html切换 webrtc 模式测试。低延迟的体验不是玄学实测同一网络环境内RTMP 播放延迟约 2-3 秒WebRTC 能压到 500ms 左右。这对于在线教育中的白板互动、远程手术示教这类敏感场景是完全不同的产品体验。5.3 监控摄像头 RTSP 取流转推公网直播另一个经常在项目里遇到的场景是把海康、大华之类的 IP 摄像头的 RTSP 流转推到 SRS实现公网观看。摄像头本身不支持 RTMP 推流需要中间借助 FFmpeg 做协议转换。假设摄像头 RTSP 地址是rtsp://user:password192.168.1.100:554/Streaming/Channels/101推流命令如下ffmpeg -rtsp_transport tcp -i rtsp://user:password192.168.1.100:554/Streaming/Channels/101 \ -c copy -f flv rtmp://localhost:1935/live/camera1这里特意用了-rtsp_transport tcp因为 UDP 传输在跨网段时容易丢包花屏TCP 稳定性好很多。转流成功后SRS 侧再做 HLS 切片或 WebRTC 分发外部用户就能通过网页看监控画面了。我做过一个项目把 16 路摄像头转推到 SRS再通过 H5 页面集中展示一台 4C8G 的服务器跑得稳稳当当。6. 常见问题与排查技巧实录6.1 容器启动失败端口占用与配置语法NaN6.2 推流成功但播放黑屏或卡顿NaN6.3 WebRTC 一直连接中无法出画面NaN6.4 HLS 延迟越来越大切片时间戳错乱NaN

相关新闻

中科大IPv4/IPv6双栈测速原理与实操指南

中科大IPv4/IPv6双栈测速原理与实操指南

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

2026/9/20 20:04:46 阅读更多 →
Lucky 部署与功能实操指南:端口转发、DDNS 与反向代理配置

Lucky 部署与功能实操指南:端口转发、DDNS 与反向代理配置

Lucky 部署与功能实操指南:端口转发、DDNS 与反向代理配置 【免费下载链接】lucky 软硬路由公网神器,ipv6/ipv4 端口转发,反向代理,DDNS,WOL,ipv4 stun内网穿透,cron,acme,rclone,ftp,webdav,filebrowser 项目地址: https://gitcode.com/GitHub_Trending/luc/luck…

2026/9/20 20:03:46 阅读更多 →
PyPTO `get_spr` 特殊寄存器读取 API 详解:读取 AddrReg 字节数实现压缩数据长度感知

PyPTO `get_spr` 特殊寄存器读取 API 详解:读取 AddrReg 字节数实现压缩数据长度感知

PyPTO get_spr 特殊寄存器读取 API 详解:读取 AddrReg 字节数实现压缩数据长度感知 【免费下载链接】pypto PyPTO(发音: pai p-t-o):Parallel Tensor/Tile Operation编程范式。 项目地址: https://gitcode.com/cann/pypto …

2026/9/20 20:03:46 阅读更多 →

最新新闻

3步搞懂个性化学习源码,从入门到精通避开报错坑

3步搞懂个性化学习源码,从入门到精通避开报错坑

3步搞懂个性化学习源码,从入门到精通避开报错坑 刚转行搞后端,最头疼的不是算法,而是那满屏红色的 StackTrace。报错信息像天书,指针指向哪哪都错,查文档半天找不到头绪。这种痛苦,我见过太多人经历。其实,这背后往往不是逻辑问题,而是你…

2026/9/21 22:59:56 阅读更多 →
宅男福利下载源码深度剖析

宅男福利下载源码深度剖析

配置环境就卡半天,下载器代码看着简单,跑起来全是Bug。很多人以为【宅男福利下载】只是写个HTTP请求,实则底层网络协议与并发控制才是深水区。今天咱们不整虚的,直接上【源码解析】,拆解那些让你深夜抓狂的403、429错误。…

2026/9/21 22:59:56 阅读更多 →
让具身机器人“能干细活”:从WRC看大小脑控制器的量产破局

让具身机器人“能干细活”:从WRC看大小脑控制器的量产破局

今年世界机器人大会(WRC)看下来,最直观的感受是:行业终于不秀“花活”了。翻跟头、跳街舞的 demo 越来越少,落地量产如产线装配、物流分拣、重载搬运这些“枯燥”但能赚钱的场景越来越多。具身智能的竞争,已…

2026/9/21 22:59:56 阅读更多 →
LangChain AI应用开发框架核心组件的使用 - Redis 向量存储 : 理解 Redis 向量存储及相关概念, Redis 向量存储的增删查改, Redis向量搜索(相似性搜索与元数据过滤)

LangChain AI应用开发框架核心组件的使用 - Redis 向量存储 : 理解 Redis 向量存储及相关概念, Redis 向量存储的增删查改, Redis向量搜索(相似性搜索与元数据过滤)

目录 一、Redis 向量存储 基本概念 理解 RediSearch 理解 Index 理解 Index Fields 理解 metadata schema 二、环境设置 基本操作 初始化 添加文档 获取文档 删除文档 三、向量搜索 相似性搜索 元数据过滤 最大边际相关性搜索 四、Pinecone 向量存储 Pinecon…

2026/9/21 22:59:56 阅读更多 →
小向美源码手写实现拆解,解决搭项目难题

小向美源码手写实现拆解,解决搭项目难题

小向美源码手写实现拆解,解决搭项目难题 学会语法却不知怎么搭项目,这是无数开发者卡在半路上的死结。很多人以为只要背下 API…

2026/9/21 22:59:56 阅读更多 →
10年装修避坑指南:史上最详细的装修日记拆解

10年装修避坑指南:史上最详细的装修日记拆解

10年装修避坑指南:史上最详细的装修日记拆解 满屏的红色报错信息堆在眼前,StackTrace 长得像天书,这种窒息感我懂。很多刚入行的兄弟,拿着手机对着复杂的施工现场或者代码逻辑发呆,觉得底层原理高不可攀。其实,把“史上最详细的装修日记”…

2026/9/21 22:58:55 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →