ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

SRS + OBS 五分钟搭建直播推流系统:从部署到避坑实战指南

SRS + OBS 五分钟搭建直播推流系统:从部署到避坑实战指南 1. 为什么选择 SRS OBS 这套组合1.1 从一次直播卡顿说起去年帮一个做在线教育的朋友处理直播卡顿的问题他当时用的是某云厂商的直播服务按流量计费一个月下来账单吓人而且延迟忽高忽低学生端经常反馈“老师声音和画面对不上”。我问他有没有考虑过自建流媒体服务器他第一反应是“那玩意儿是不是很复杂”。实际上SRSSimple Realtime Server加上 OBS Studio 这套组合从零到跑通推流熟练的话真的只要五分钟。这篇文章就是把我这些年反复搭建、调试、踩坑的经验整理出来。SRS 是一个开源的流媒体服务器支持 RTMP、HLS、HTTP-FLV、WebRTC 等协议OBS Studio 则是目前最主流的开源推流客户端。两者搭配你可以用极低的成本搭建一套属于自己的直播推流系统适用于在线教育、游戏直播、企业内训、活动直播回放等场景。不管你是刚接触流媒体的新手还是已经用过其他方案想换一套更可控的这篇内容都能直接抄作业。1.2 SRS 到底解决了什么问题很多人第一次听到“流媒体服务器”会觉得离自己很远其实你可以把它理解成一个“中转站”。OBS 负责把摄像头画面和麦克风声音打包推送到 SRS 服务器SRS 再把这份数据分发给所有观看端。没有这个中转站每个观众都要直接连到你的电脑上显然不现实。SRS 的核心优势在于第一它是国产开源项目文档中文友好社区活跃第二资源占用低一台 2 核 4G 的云主机就能扛住几百路并发第三协议支持全RTMP 推流、HTTP-FLV 和 HLS 拉流、WebRTC 低延迟通话都能搞定。相比动辄按流量计费的商业方案自建 SRS 的成本几乎只有服务器本身的费用。1.3 OBS 在推流链路中的角色OBS Studio 负责的是“采集 编码 推送”这三件事。采集包括屏幕、摄像头、麦克风、窗口捕获等编码就是把原始画面压缩成 H.264音频压缩成 AAC推送就是通过 RTMP 协议把编码后的数据发给 SRS。OBS 的插件生态也很丰富比如抠像插件、语音朗读插件、比赛回放插件等都可以按需加载。需要特别说明的是OBS 的版本更新比较频繁目前常见的有 27.x、28.x、29.x 等。不同版本在界面布局和插件兼容性上会有差异后面我会专门讲插件目录的问题。另外网上有人搜“obs 汉化版”其实 OBS 官方安装包自带简体中文在设置里切换语言即可不需要额外下载所谓的汉化版那些第三方打包的版本反而可能夹带私货。2. 五分钟搭建 SRS 服务器的完整流程2.1 服务器环境准备与选型建议先说服务器。你可以在本地电脑上跑 SRS 做测试也可以买一台云主机。本地测试的话Windows 和 macOS 都能用 Docker 跑Linux 直接编译或下载二进制包。云主机的话建议选 2 核 4G 起步带宽根据你的并发观看人数来定。假设每路流码率是 2 Mbps10 个人同时观看就需要 20 Mbps 的出带宽这个账要提前算清楚。操作系统推荐 Ubuntu 20.04 或 22.04CentOS 7 也可以但已经停止维护了。我实测下来 Ubuntu 的兼容性最好遇到问题搜资料也方便。如果你用的是华为云、阿里云这类平台注意安全组要放行相关端口否则推流会一直连不上。注意云主机的公网 IP 和私网 IP 要分清。OBS 里填的推流地址必须是公网 IP 或者绑定的域名填成私网 IP 只有同内网的机器能访问。2.2 三种部署方式对比与选择SRS 的部署方式主要有三种Docker 部署、二进制包部署、源码编译部署。我整理了一个对比表你可以根据自己的情况选。部署方式优点缺点适合人群Docker一条命令搞定环境隔离需要先装 Docker新手、快速验证二进制包解压即用不依赖 Docker版本更新需手动替换有一定 Linux 基础源码编译可定制功能最新特性编译耗时长依赖多开发者、深度定制如果你只是想快速跑通直接用 Docker。命令如下docker run -d --name srs \ -p 1935:1935 -p 1985:1985 -p 8080:8080 \ ossrs/srs:5 \ ./objs/srs -c conf/docker.conf这条命令启动了 SRS 5.0 版本映射了三个端口1935 是 RTMP 推流端口1985 是 HTTP API 端口8080 是 HTTP-FLV 和 HLS 的播放端口。跑起来之后用docker logs srs看一下日志出现 “Server started” 就说明成功了。2.3 配置文件的关键参数解读如果你用二进制包或者源码编译核心配置文件是conf/srs.conf。我挑几个最关键的参数讲一下这些参数直接决定了你的推流能不能成功、延迟有多高。listen 1935; max_connections 1000; daemon off; srs_log_tank console; http_server { enabled on; listen 8080; dir ./objs/nginx/html; } vhost __defaultVhost__ { http_remux { enabled on; mount [vhost]/[app]/[stream].flv; } hls { enabled on; hls_path ./objs/nginx/html; hls_fragment 10; hls_window 60; } }max_connections控制最大连接数根据你的服务器性能调整。http_remux开启后可以用 HTTP-FLV 协议拉流延迟比 HLS 低很多大概 1 到 3 秒。hls_fragment是 HLS 切片时长设成 10 秒意味着每 10 秒生成一个 ts 文件延迟会比较高但兼容性好适合对延迟不敏感的场景。hls_window是播放列表长度60 表示保留最近 60 秒的切片。提示如果你追求低延迟优先用 HTTP-FLV 或者 WebRTCHLS 的延迟天然就高这是协议本身决定的不是配置能解决的。3. OBS 推流配置的详细步骤3.1 推流地址与串流密钥的填写规则OBS 里配置推流的位置在“设置” - “推流”。服务类型选“自定义”服务器填你的 SRS 地址格式是rtmp://你的服务器IP:1935/live串流密钥填一个你自定义的流名称比如teststream。注意这里的live是应用名可以改但要和 SRS 配置里的 vhost 对应上。很多人第一次填的时候会把服务器写成rtmp://IP:1935/live/teststream然后把串流密钥空着这样也能推但规范做法是服务器只写到应用名流名称放在串流密钥里。两种写法 SRS 都认但分开写更清晰后面做多路流管理的时候不容易乱。推流成功后你可以用以下地址测试播放HTTP-FLV:http://你的服务器IP:8080/live/teststream.flvHLS:http://你的服务器IP:8080/live/teststream.m3u8用 VLC 或者 ffplay 打开这个地址能看到画面就说明整条链路通了。3.2 编码参数怎么调才不卡OBS 的编码设置直接影响到推流质量和服务器压力。在“设置” - “输出”里输出模式选“高级”然后重点调这几个参数编码器优先选硬件编码比如 NVIDIA NVENC 或者 Intel QSV比软件编码 x264 省 CPU。如果没有独立显卡就用 x264预设选veryfast或faster。码率720p 建议 2500 到 4000 Kbps1080p 建议 4500 到 6000 Kbps。码率太高上行带宽扛不住会丢帧太低画面会糊。关键帧间隔设成 2 秒。这个参数影响拉流端首屏速度和 seek 体验太大太小都不好。预设x264 用veryfastNVENC 用quality或balanced。我踩过的一个坑是码率设了 8000 Kbps结果家里上行只有 10 Mbps推流一直重连。后来降到 3500 Kbps稳定得很。所以推流前一定要测一下自己的上行带宽留出至少 30% 的余量。3.3 音频设置与常见误区音频这块采样率设 44.1kHz 或 48kHz声道选立体声或单声道。如果你的内容只是人声讲解单声道就够了还能省一半音频码率。音频码率设 128 Kbps 或 160 Kbps 都行再高意义不大。常见误区是有人把音频码率拉到 320 Kbps觉得音质会更好实际上经过 RTMP 传输和服务器转发观众端听到的差异微乎其微反而增加了带宽负担。另外如果麦克风有底噪可以在 OBS 里加一个“噪声抑制”滤镜比后期处理省事得多。4. 常见问题排查与实战避坑指南4.1 推流连不上服务器的排查思路推流连不上是最常见的问题排查顺序应该是网络 - 端口 - 配置 - 防火墙。先确认服务器 IP 能不能 ping 通然后 telnet 一下 1935 端口通不通。如果端口不通检查云主机安全组和服务器本机防火墙。Ubuntu 上用ufw status看防火墙规则CentOS 用firewall-cmd --list-ports。如果端口通了但 OBS 还是报错看 SRS 的日志。日志里会明确告诉你连接是否建立、握手是否成功。常见错误有“RTMP handshake failed”一般是推流地址写错了“no app found”是应用名对不上。我遇到过最隐蔽的一个问题是服务器时间不对导致 RTMP 握手校验失败用date命令同步一下时间就好了。4.2 播放端黑屏、卡顿、延迟高的原因播放端黑屏但 OBS 显示推流正常大概率是拉流地址写错了或者播放器不支持对应的协议。HTTP-FLV 地址必须以.flv结尾HLS 必须以.m3u8结尾。用浏览器直接打开 FLV 地址是播不了的需要支持 FLV 的播放器比如 VLC 或者专门的 Web 播放器。卡顿的话先看服务器带宽是否跑满用iftop或者nload监控一下。如果带宽没问题再看 OBS 的丢帧情况OBS 底部状态栏会显示“丢帧”百分比超过 1% 就说明上行有问题。延迟高的话HLS 天然延迟在 10 到 30 秒换成 HTTP-FLV 能降到 1 到 3 秒WebRTC 可以做到 500 毫秒以内但配置更复杂。4.3 OBS 插件目录与版本兼容问题关于“obs plugin插件放到那个文件夹内”这个问题不同系统路径不一样Windows:C:\Program Files\obs-studio\obs-plugins\64bitmacOS:/Applications/OBS.app/Contents/PlugInsLinux:/usr/lib/obs-plugins或~/.config/obs-studio/plugins需要注意的是OBS 27.x 和 28.x 之后的插件接口有变化有些老插件在新版本上会加载失败。如果你装了插件但 OBS 里看不到先确认插件版本是否匹配你的 OBS 版本。另外OBS 29 之后对插件签名有要求未签名的插件可能被拦截需要在设置里手动允许。注意不要随便下载来路不明的插件包尤其是所谓的“汉化版”整合包里面可能捆绑了不需要的软件。官方插件一般发布在 GitHub 上下载前看一下 issue 区有没有兼容性反馈。4.4 高频问题速查表问题现象可能原因解决方法OBS 推流失败提示连接超时端口未放行检查安全组和本机防火墙推流成功但播放黑屏拉流地址错误确认协议和路径后缀播放卡顿、花屏码率超过上行带宽降低码率或分辨率延迟十几秒使用 HLS 拉流换 HTTP-FLV 或 WebRTC插件加载不出来版本不兼容核对 OBS 版本和插件版本服务器 CPU 跑满软件编码 高并发启用硬件编码或升级配置5. 进阶玩法与场景扩展5.1 多路推流与回放录制SRS 支持同一个流被多个客户端拉取也支持把推流内容录制下来。在 vhost 配置里加上 DVR 相关配置就能自动把每路流存成 FLV 或 MP4 文件。这个功能对于“比赛回放”这类场景特别实用直播结束后直接提供点播地址就行。dvr { enabled on; dvr_path ./objs/nginx/html/[app]/[stream].[timestamp].flv; dvr_plan session; }dvr_plan选session表示按推流会话录制一次推流生成一个文件。如果选segment会按时间切片。录制文件默认是 FLV 格式想转 MP4 可以用 ffmpeg 批量处理。5.2 结合第三方工具的扩展思路OBS 的插件生态可以玩出很多花样。比如抠像插件可以做虚拟背景适合在线教学语音朗读插件可以把弹幕读出来适合互动直播还有各种转场、滤镜插件能提升画面质感。SRS 这边可以通过 HTTP API 获取流列表、踢掉某个流、查询在线人数方便做后台管理。如果你想把直播嵌入自己的网站可以用 SRS 提供的 HTTP-FLV 地址配合 flv.js 播放器几行代码就能搞定。HLS 的话直接用 video.js 或者原生 video 标签就行兼容性更好但延迟高。5.3 安全加固与访问控制默认配置下任何人知道你的推流地址就能推流这显然不安全。SRS 支持推流鉴权可以在 URL 里加 token服务器校验通过才允许推流。配置方式是在 vhost 里加http_hooks推流时回调你的鉴权接口。另外播放端也可以做防盗链通过 Referer 白名单或者 URL 签名来限制。如果只是内部使用最简单的办法是把 RTMP 端口只对特定 IP 开放其他 IP 一律拒绝。这些安全措施虽然会增加一点配置成本但能避免流被恶意盗用。6. 我踩过的那些坑与实操心得6.1 关于服务器时间同步的教训前面提过服务器时间不对导致 RTMP 握手失败这个坑我踩了两次。第一次排查了半天以为是端口或者配置问题最后无意中date看了一下发现时间差了十几分钟。RTMP 握手时会校验时间戳偏差太大会直接拒绝连接。所以新服务器上手第一件事就是ntpdate或者chrony同步时间这个习惯能省很多事。6.2 码率与带宽的匹配经验很多人推流卡顿第一反应是服务器不行其实大部分情况是上行带宽不够。我一般建议按“上行带宽 × 0.7”来设码率。比如上行 10 Mbps码率最多设 7000 Kbps留出余量给网络波动。另外OBS 的“动态码率”功能在 28 版本之后有改进网络差的时候会自动降码率但画质也会降看你能不能接受。6.3 插件管理的个人建议插件这东西够用就行不要贪多。每装一个插件都会增加 OBS 启动时间和崩溃风险。我自己的习惯是只装当前项目必须的插件项目结束就卸载。另外插件更新前先备份 OBS 的配置目录万一新版本有问题可以快速回滚。Windows 下配置目录在%APPDATA%\obs-studiomacOS 在~/Library/Application Support/obs-studio。6.4 日志是最好的老师不管是 SRS 还是 OBS出问题先看日志。SRS 的日志在./objs/logs/目录下OBS 的日志在“帮助” - “日志文件”里可以打开。日志里会记录每一步的状态和错误码比瞎猜高效得多。我现在的习惯是每次搭建新环境先把日志级别调到 debug跑通之后再调回 info这样排查问题的时候信息最全。最后再分享一个小技巧如果你经常需要给别人演示推流配置可以把 SRS 和 OBS 的配置做成模板换服务器的时候只需要改 IP 和流名称其他参数直接复用。这样五分钟搭建真不是吹的熟练之后三分钟就能跑起来。
返回列表