尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

多路推流实战:从带宽测算到Nginx中转的稳定性复盘

多路推流实战:从带宽测算到Nginx中转的稳定性复盘 上个月我把工作室一台主力电脑改成了多路推流工作站。一个直播信号同时推到抖音、B站、快手三个平台从月初一直跑到现在中间只因为平台公告里写的例行维护主动断过两次。这个结果听起来挺稳但说实话我是踩了不少坑才换来的。所谓多路推流说白了就是把一路视频流同时发到多个直播平台听起来一句话的事真正要长期稳定跑起来从带宽测算、编码参数、推流架构到每个平台各自的隐性限制全是细节。这篇内容不打算写成软件教程而是把我从选方案到上线、再连续跑一个月的过程完整复盘一遍。适合三类人看被老板一句话要求三个平台同时开播的技术执行者想靠一台机器做多平台分发的个人主播以及已经在做多路推流但老觉得不稳、想找排查思路的直播运营。1. 多路推流的整体方案先算清账再谈稳定1.1 哪些人真的需要多路推流我接触到的多路推流需求大致分三类。第一类是直播电商。同一个主播、同一套灯光、同一个货盘分别推到不同平台让不同平台的用户都能进直播间这是最典型的多路推流用法。它省掉的不只是几台手机更是几个人力——不需要每个平台安排一个人盯着开播。第二类是会议、培训、赛事直播。主办方要求把一路现场信号同时分发到内部平台和公众平台一般还有低延迟要求。这种场景最怕断流因为观众是被动收看的你断了他们不会回来。第三类是个人IP同步运营。不想在每个平台分别搭一套开播环境一台电脑加一个采集画面全部搞定。对于这类用户我的建议是别一上来就上三路先跑两路稳定了再加。另外还有一种反向用法一台电脑接多个采集卡把不同摄像头的信号分别推到不同平台。这本质上也是多路推流只是每一路的内容来源不一样坑会更多后面我会提到。1.2 三种推流架构别照抄别人的市面上常见的多路推流方案可以分成三种直接多推、云转推、自建RTMP中转。我在这个月里把三种都试了一圈先说结论再给对比。直接多推就是本地电脑装好OBS类软件通过插件同时往多个平台推流。优点是部署最快、链路最短、你能控制每一路的编码参数缺点是本地上行带宽会被成倍吃掉而且所有路都绑在同一个软件进程里软件一崩全部黑屏。云转推是本地只往云端推一路由云服务商帮你分发到多个平台。优点是本地带宽压力小平台之间断了能自动切换缺点是按路数或时长收费延迟会多出几秒而且你多了一层不可控的中间环节。自建RTMP中转是在一台服务器上跑Nginx加RTMP模块设置成一进多出。本地推一路到这台服务器服务器再往各平台转推。灵活、可控、能看日志但要会Linux出了问题只能自己扛。方案原理优点缺点适合谁直接多推本地客户端同时推N路部署快、可控性强上行带宽吃紧、单点故障个人主播、小团队云转推本地推一路云端分发省本地带宽、有断流保护按量付费、延迟略高有稳定预算的公司自建RTMP中转服务器一进多出完全可控、日志完整需要运维能力有技术底子的团队我的最终组合是主平台用OBS直接推另外两个平台走自建Nginx中转。这样即使某一路平台抽风也不会影响主路。后文我会把每种的配置细节都写出来。1.3 带宽不是拍脑袋先算账很多人第一步就栽在带宽上。你要明白一件事多路推流的上行带宽需求是单路码率 × 路数来算的不是看宽带套餐里那个500M、1000M的数字那个一般指的是下行。计算公式很简单上行带宽 (视频码率 音频码率) × 路数再乘以1.3左右的抖动余量。举个例子。我要推三路每路是1920x1080、30帧、6000kbps视频码率加192kbps音频码率。那么总上行大约是 (6000 192) × 3 18576kbps加上余量之后接近24Mbps。也就是说你的实际可用上行带宽至少要有25到30Mbps才敢说三路1080p同时推。问题在于很多家庭宽带和办公宽带上行只有20到40Mbps晚高峰还会缩水。所以上线前我建议你先做两件事第一把电脑直接用网线接到光猫或主路由上测速不要用Wi-Fi第二分别在白天和晚高峰各测一次记录上传速度和丢包率。注意如果上行带宽实在不够我建议优先降分辨率而不是一味降码率。720p、30帧、4000kbps的三路比1080p、60帧、超低码率的三路观感要好得多因为平台本身还会做二次转码超低码率的高分辨率画质会糊成一团。2. 核心参数与平台差异细节决定跑多久2.1 编码参数怎么设一台机器扛几路多路推流对编码资源的消耗是叠加的。我见过不少人一台电脑同时开三路x264软编结果CPU飙到100%画面掉帧、声音卡顿然后开始怀疑平台有问题。其实问题出在编码器选型上。我的建议是混合编码主路用CPU跑x264预设调到faster或veryfast分流用显卡硬件编码N卡用NVENCIntel核显用QSVA卡用AMF。这样CPU和GPU分担压力不容易碰到单侧瓶颈。如果你的N卡比较老还要确认硬件编码会话数上限新卡一般支持多路同时编码老卡可能只有一两路超过之后编码器会直接罢工。编码参数上有几个关键项是平台兼容性的分水岭编码格式统一用H.264 High Profile不要碰H.265。很多平台的直播接入虽然支持HEVC但兼容性远不如H.264尤其第三方推流时容易采不到流。码率控制用CBR固定码率直播场景千万不要用VBR或CRF否则网络抖动时码率会剧烈波动平台判定你断流。关键帧间隔设成2秒。也就是30帧填6060帧填120。关键帧间隔太长观众端秒开会很慢切流、卡顿恢复也要等很久。B帧数量尽量控制在2以内。B帧越多压缩率越高但部分平台的后端转码对高B帧的流兼容性不好会出现花屏、跳帧。分辨率方面1920x1080是一个安全值绝大多数平台都支持。但各平台对码率档位确实不一样我整理了一份安全起点具体以你账号后台能看到的直播设置档位为准平台安全码率起点第三方推流注意点抖音6000kbps优先用官方工具开原画第三方推流注意分辨率档位B站6000kbps原画上限较宽松但别长期超过8000kbps快手4000-5000kbps移动端观众多720p 30帧完全够用视频号4000-5000kbps后台固定档位和直播类型有关补充一句你本地推的码率是编码输出码率不等于观众最终看到的码率。平台会做二次转码这是正常现象不要因为这个去怀疑自己参数出了问题。2.2 音频设置是重灾区音频是这次跑了一个月之后我最想吐槽的部分。多路推流的音频坑比视频坑隐蔽得多。第一采样率必须统一到48kHz编码用AAC-LC声道用Stereo双声道。有些平台的接入服务器对音频参数很敏感你如果用了44.1kHz的音频源推到一半可能出现音画错位或者某个平台干脆没声音。我上个月就遇到过一次音频源来自一块4声道声卡B站正常抖音直接无声排查了两个小时才发现是声道数问题。第二响度问题。不同平台接入后会自动做响度归一规则不一样同一个声音推过去有的平台听起来正好有的平台就偏小。解决办法是在OBS的音频滤镜里加一个压缩器加一个限制器把输出响度控制在比较稳的范围。不要只动OBS主音量那样治标不治本。第三直播过程中如果要放背景音乐、连麦、接电话尽量在推流前把音频路由调好不要在直播中途频繁切换音频设备。多路推流状态下音频设备的热拔插很容易让某一路的音频轨道直接丢失而OBS界面还不一定会给你明显报错等观众反馈没声音了再处理已经晚了。2.3 延迟与同步多平台天生快慢不一样多平台同时推流你要接受一个事实各平台的端到端延迟天然不一样。有的平台观众看到画面比另一个平台快两三秒有的平台慢到五六秒这跟你的推流设置关系不大主要是平台侧的播放延迟策略不同。所以我在直播间的固定话术是各位平台的延迟不一样大家以画面为准别因为某平台先看到就催我。这句话能省掉很多售后式解释。长期运行还有一个容易忽略的点单场直播时长限制。有些平台对单场直播有硬性时长上限到点会主动断流而且不会提前通知。我跑了一个月中途就遇到过连续开了四十多个小时后两个平台同时被断开的情况。多路推流如果要跑超长时段一定要提前规划分段到时间主动下播重开别等平台来断你。3. 实操把三路推流真正跑起来3.1 上线前准备权限、地址和密钥管理多路推流正式开始之前先把每个平台的推流地址和串流密钥准备好。这些东西在各平台的创作者后台、直播中心里都能找到一般叫开播设置或者推流设置。要注意的是不是每个平台注册完就能推流。有些平台需要实名认证有些需要选择直播分类还有一些对开播账号有粉丝量或权限门槛。提前用平台的测试直播间或私密直播功能验证一遍别等到正式开播当天才发现权限没开通。密钥管理这件事我做得很保守。串流密钥就是你的直播门锁任何人拿到它都能往你的直播间推流轻则画面被替换重则触发平台风控导致封号。所以我不建议把完整推流地址截图发到群里包括工作群。OBS里直接粘贴就行重要的账号信息单独存到一个加密笔记里。另外平台给的推流地址一般由两部分组成一部分是RTMP服务器地址比如rtmp://push.example.com/live/另一部分是串流密钥也就是一串随机字符串。填到推流工具时这两个字段要分开填不要拼在一起。我见过有人把整条URL当成服务器地址填进去结果一直连接失败报错还不明显。3.2 OBS 直接多推最快上手的方案OBS原生只支持推一个直播服务要做多路推流需要装一个社区插件常见名字叫Multi-RTMP也有的版本叫Multiple RTMP outputs。装好之后在OBS界面里会多出一个多路输出面板。配置步骤如下先在OBS的设置→直播里把第一路配好作为主平台。打开多路输出面板点添加输出填平台的RTMP服务器地址和串流密钥。这里别偷懒每一路都要单独填并且建议给每一路起一个容易区分的名字比如抖音主推、B站中继。每个输出可以单独选择编码器。我的做法是主输出用x264 medium或faster附加输出用NVENC或QSV的快速预设避免全部挤在同一个编码器上。开播后把多路输出面板里的丢帧率列打开实时观察每一路的健康状态。这里有一个OBS重连逻辑的坑OBS的自动重连通常只对主输出有效附加输出如果断了不一定能自动恢复。所以重要场次我会在手机上盯一下各平台的后台一旦发现某路断了手动点重连而不是傻等。3.3 ffmpeg 分发应对不同平台码率上限如果每个平台对码率的上限不一样或者你想用一个本地文件做循环轮播分发ffmpeg是比OBS插件更灵活的方案。它的核心思路是先把视频流和音频流分别复制成多份再分别编码输出。用一个实际例子说明。假设我要把一个本地视频文件推到两个平台一个是6000kbps一个是4500kbps可以这样写ffmpeg -re -stream_loop -1 -i source.mp4 \ -filter_complex [0:v]split2[v1][v2];[0:a]asplit2[a1][a2] \ -map [v1] -map [a1] \ -c:v libx264 -preset veryfast -b:v 6000k -maxrate 6000k -bufsize 12000k \ -c:a aac -b:a 192k -f flv rtmp://platformA/live/keyA \ -map [v2] -map [a2] \ -c:v libx264 -preset veryfast -b:v 4500k -maxrate 4500k -bufsize 9000k \ -c:a aac -b:a 128k -f flv rtmp://platformB/live/keyB-r 参数负责按真实时间读取-stream_loop -1 让文件循环播放filter_complex 里的 split 和 asplit 负责把画面和声音复制成两份后面两段分别指定两路的编码参数、码率和推流地址。这个方案更适合录播、轮播、跨平台测试这类场景。如果是在线直播我还是更推荐OBS插件或Nginx中转因为ffmpeg的命令行模式一旦参数写错排查成本比图形界面高不少。3.4 自建中转Nginx-RTMP 一进多出月中的时候我把两路分流改成自建Nginx中转主要是看中它的日志能力和稳定性。思路很简单OBS只推一路到本地或云服务器上的NginxNginx收到流以后自动往配置好的多个平台同时转推。Nginx需要编译RTMP模块或者直接找一个带rtmp模块的镜像。核心配置是这样的rtmp { server { listen 1935; chunk_size 4096; application live { live on; record off; push rtmp://platformA/live/keyA; push rtmp://platformB/live/keyB; push rtmp://platformC/live/keyC; } } }配置完成后OBS的推流地址填rtmp://服务器IP/live/main串流密钥填一个自己随便写的字符串比如main。Nginx收到流之后会自动转发到push指令里列出的所有平台。用这个方案要分清楚带宽位置。如果Nginx装在本机那它转推出去还要走本地上行带宽和直接多推没区别如果Nginx装在云服务器上那云服务器的上行带宽才是真正的瓶颈本地反而只要满足推到云服务器这一路的带宽就行。自建中转还有一个好处是能加鉴权。在实际生产环境里我会限制只允许内网IP或固定IP推流防止别人拿你的地址乱推。另外Nginx的error_log和access_log一定要打开后面遇到断流排查时日志就是你的第一手证据。3.5 长期运行的稳定性压测不管是哪种方案正式上线之前一定要做压测。我自己的标准是至少连续推30分钟以上所有平台同时开过程中要盯四类指标。第一机器的CPU和GPU使用率。编码是重负载任务如果长时间高负载导致温度过高CPU会降频画面会掉帧。第二推流端的丢帧率和网络抖动OBS统计面板里都有。第三各平台后台的直播状态是否稳定有没有抽搐、断流重连的提示。第四内存占用曲线跑长直播最容易漏掉内存泄漏的问题。注意压测不要用自己日常办公的电脑也不要用公司内网那些开了QoS或防火墙的线路。RTMP推流对网络丢包很敏感路由器的QoS策略有可能把推流流量排在后面导致看起来网络通实际延迟抖动很夸张。我上个月之所以能稳定跑一个月很大一部分原因是前期的压测把雷都排掉了。散热、电源、网络这三样在长期运行场景里比软件配置更重要。我给光猫、路由器和主机配了一个UPS至少断电的时候能撑到自动关机而不是所有平台一起瞬间黑屏。4. 一个月跑下来我遇到的那些隐藏坑4.1 高频问题速查表一个月里我处理过的断流、卡顿、无声问题简单整理成一张速查表遇到一个查一个现象大概率原因处理办法一个平台突然断流其他平台正常该平台会话超时、串流密钥失效或平台侧主动断开去后台重置密钥重新推流看平台公告画质很糊但码率看着不低编码器预设太快、平台二次转码压得狠用veryfast或faster预设分辨率720p起步音画不同步且越来越严重音频采样率不统一、网络丢包导致时间戳偏移音频统一48kHz检查丢帧率断流重推OBS频繁提示连接超时路由器NAT会话超时、上行带宽被占满换网线、减少路数或降码率必要时重启路由器某个平台没声音声道数不是双声道、音频设备被切换确认AAC-LC双声道直播中不动音频设备平台提示直播画面异常画面长时间无变化或触发了平台内容规则检查是否画面卡死并核对直播类型是否符合平台规则这张表里的问题大部分不是一次性解决就完了。比如串流密钥有的平台会定期失效你重置一次旧的立刻作废如果你缓存了旧地址下次开播就会失败。我现在养成了每周检查一次各平台密钥的习惯并且在日历上设了提醒。4.2 三个没人提醒我的细节坑第一个坑是推流地址的拼接方式。有的平台在后台会把完整地址显示成一长串包括服务器地址、应用名、参数和密钥。用Multi-RTMP插件时如果你把它当成一小段服务器地址填进去就会一直连接失败。正确做法是把rtmp://xxxx部分作为服务器地址把后面那一串参数和密钥作为串流密钥分开填。第二个坑是高路数下的散热。三路编码同时跑GPU核心温度比玩游戏还高。我月中换过一次机箱风扇因为NVENC长时间满载后温度压不住导致编码器轻度降频画面出现周期性卡顿。这种问题在推流界面上没有直接报错只有盯温度曲线才能发现。第三个坑是单点故障。一开始我把三路全放在OBS一个进程里Windows系统更新重启了一次三路全断。后来我把分流挪到云上的NginxOBS只负责推主路和推给NginxWindows更新、杀毒软件弹窗这类问题就只影响一路不再全灭。对于重要场次我还会准备一台备用电脑跑ffmpeg循环推流验证信号用的测试视频文件一直放在桌面一旦主路出问题两分钟内能顶上。4.3 预算允许时可以上云转推如果你每周开播超过三次、每次时长在两小时以上而且不想半夜爬起来重启Nginx或者OBS那我建议认真考虑云转推服务。云转推的核心价值是帮你把本地得一直在线这件事外包出去。你只需要保证本地到云这一路稳定云端到各平台之间的转发、断流重连、按平台匹配参数都由服务商处理。对你来说工作变成了开播前配好地址播完看统计数据。缺点也很明确要花钱而且视频流会多绕一段路延迟比直接推要高一些。另外转推服务本质上是把同一份内容二次分发到多个平台用之前一定要读清各平台对内容分发的规则避免产生不必要的风险。如果你本身有技术能力也可以考虑用开源的SRS或ZLMediaKit这类媒体服务器做自己的分发网关。它们的定位比Nginx-RTMP更贴近直播场景断流重连、鉴权、上报都更完善适合想长期把多路推流做成稳定基础设施的团队。跑了一个月我最深的体会是多路推流真正难的不是把软件配置好而是对每一路平台的脾气摸清楚。平台的重连策略、密钥有效期、单场时长限制、二次转码规则每一项都可能让你的直播在某一天毫无征兆地断掉。如果让我重新来一次我会从两路起步先建立一套开播前检查清单和断流记录日志再慢慢加到三路、四路。真正的稳定不是靠运气是把每个可能断流的点都提前堵死。
返回列表