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

资讯详情

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

webrtc2rtmp测试环境搭建:从链路拆解到排查实践

webrtc2rtmp测试环境搭建:从链路拆解到排查实践 webrtc2rtmp 测试环境的核心不是把某个转换服务装起来就算完成。真正要测的是四段链路WebRTC 推流端、转换服务、RTMP 服务端、播放验证端。只要链路里有一段没对齐画面就会黑屏、卡住或者推流端看起来连接成功但服务器里根本没有流。这篇文章会按我搭建测试环境的过程往下拆适合刚接触 WebRTC 转 RTMP、想在本地或内网验证功能的开发者参考。很多人以为 webrtc2rtmp 是一个独立软件装完就能直接跑。实际项目里它通常是一个转换服务或转发网关负责接收 WebRTC 的媒体流再以 RTMP 协议推到流媒体服务端。所以测试环境要覆盖的不只是转换服务本身还要包括信令服务、媒体端口、RTMP 服务端和播放器。下面先讲清楚测试环境到底在测什么再按系统、网络、链路搭建、验证标准和排查顺序一步步拆。1. webrtc2rtmp 测试环境到底在测什么1.1 先纠正一个常见误解先纠正一个常见误解webrtc2rtmp 不是一个“输入网址输出 RTMP 地址”的黑盒。它的本质是协议转换而协议转换一定伴随着几个关键动作WebRTC 推流端通过信令协商出 SDP完成 ICE 连接。转换服务接收 WebRTC 的 RTP 媒体包。转换服务重新封装成 FLV并通过 RTMP publish 推到流媒体服务端。播放端通过 RTMP 或 HTTP-FLV 拉流。这四步缺一不可。如果只验证了第一步和第三步很容易出现“推流端显示已连接但播放端没人任何画面”的情况。这个问题通常在 WebRTC 媒体协商或者 RTMP 推流地址上而不在转换服务本身。所以我在搭测试环境时会把整个链路拆成四个角色每个角色单独看日志。1.2 测试链路里的四个角色如果你第一次搭 webrtc2rtmp 测试环境建议先建立这个认知测试环境里通常有四个角色而不是一个服务。角色作用常见实现WebRTC 推流端产生视频和音频流Chrome 浏览器、小程序、自定义 App转换服务接收 WebRTC 流转封装后推到 RTMP项目里的 webrtc2rtmp 服务、自研网关RTMP 服务端接收并分发 RTMP 流SRS、ZLMediaKit、nginx-rtmp播放验证端拉流验证结果ffplay、VLC、浏览器播放器这四个角色之间网络端口、协议格式、编码格式都可能成为断点。测试环境的价值就是把这四个断点提前暴露出来。1.3 需要验证哪些结果我在测试时一般会盯住这几个结果WebRTC 信令是否协商成功。ICE 是否连通媒体包是否真正到达转换服务。转换服务是否成功连接到 RTMP 服务端并 publish 流。播放端能否拉流是否能同时看到画面和听到声音。长时间运行后内存、CPU、网络连接是否稳定。如果这些结果全部通过说明测试环境的“最小可行链路”已经通了。接下来才能谈参数优化、并发和批量任务。2. 系统、容器和网络怎么准备2.1 系统选型与麒麟系统的注意点webrtc2rtmp 的转换服务大多数情况下跑在 Linux 上比较省事。实际项目里Ubuntu、CentOS、麒麟Kylin这类系统我都见过。如果你用的是麒麟这类国产 Linux 发行版测试环境最需要关注的往往不是转换服务本身而是依赖源、内核防火墙、SELinux 或者 AppArmor 策略。同一个服务在 Ubuntu 上能启动到麒麟上可能因为某个系统库缺失或者安全策略导致收不到媒体包。建议先确认三件事项目文档里指定的操作系统版本和依赖版本。机器上是否已经安装 ffmpeg、ffprobe 这类基础工具。防火墙和安全策略是否允许 UDP 媒体端口通信。如果项目没有明确指定系统版本我一般先选择和部署环境最接近的系统版本而不是随便拿一台 Windows 机器就跑。Windows 更适合作为播放端和推流端不太适合作为 webrtc2rtmp 转换服务的验证服务器。2.2 端口和网络规划WebRTC 和 RTMP 对端口的要求不太一样。RTMP 通常只走一个固定 TCP 端口默认是 1935。WebRTC 则相反信令可能走 HTTPS媒体流通常走 UDP而且端口是动态的。所以在测试环境里端口规划好看过随意开放。下面是我常用的一组规划方式服务或流量端口说明WebRTC 信令服务80 或 443浏览器推流页面、信令 WebSocketWebRTC 媒体流一段 UDP 端口范围具体范围以项目配置为准RTMP 服务端1935接收转换服务推流HTTP-FLV8080 等方便用浏览器播放验证转换服务接口按项目配置用于查看状态或日志关键点在这里不要只开 1935 端口。WebRTC 的 UDP 端口没开推流端会反复尝试连接表现是“能连上信令但一直不出流”。反过来也不要为了省事直接把防火墙全部关掉。测试环境同样要保留防火墙只是端口策略可以比生产环境宽松。2.3 使用容器时的注意事项不少项目用 Docker 或 Docker Compose 来起依赖服务。容器对 webrtc2rtmp 测试来说很方便但要注意两个坑媒体端口必须映射到宿主机否则推流端连接不到容器里的 UDP 端口。容器内临时目录太小例如/dev/shm容量不足会影响媒体缓冲。我见过最典型的问题就是 Docker 只映射了 1935 端口没映射 WebRTC 的 UDP 端口范围结果推流端信令连接正常媒体流却一直无法到达转换服务。如果只是本地学习先不用容器直接用宿主机跑一遍最小链路会更直观。链路通了以后再考虑容器化。2.4 客户端准备测试端最好准备两台设备或者一台电脑加一台手机。全部在同一台机器上测试虽然方便但容易掩盖真实网络问题。浏览器推流端建议使用 Chrome 或 Chromium。注意 WebRTC 的 getUserMedia 在非 localhost 环境要求 HTTPS 页面否则浏览器不会授权摄像头或麦克风。如果推流页面部署在局域网 IP 上需要先把 HTTPS 或者本地域名处理好。3. 最小链路的搭建和跑通步骤3.1 先起一个 RTMP 服务端我习惯先把 RTMP 服务端启动因为后面的转换服务需要知道往哪里推流。以 SRS 为例通常有一个配置文件可以直接启动启动后能看到 1935 端口在监听。不同项目的配置路径不同这里不写死某个版本的命令。可以用下面这条命令确认 RTMP 端口是否已经监听ss -lntp | grep 1935如果看到 LISTEN 状态说明 RTMP 服务端已经就绪。如果没有看到先检查服务是否启动成功再看端口是否被占用。端口被占用的情况也常见。比如本机已经跑了一个 nginx-rtmp又启动 SRS两者同时想用 1935后启动的服务很容易报 bind 失败。遇到这种情况不要直接改系统防火墙先确认哪个服务占用了 1935。3.2 启动 webrtc2rtmp 转换服务RTMP 服务端就绪后再启动 webrtc2rtmp 转换服务。转换服务一般需要一个配置项用于指定 RTMP 推流地址例如./webrtc2rtmp --rtmprtmp://127.0.0.1:1935/live/test如果项目采用配置文件方式就把 RTMP 地址配置到这个值。这里的重点是推流地址里的流名称也就是test这个部分决定了播放时用哪个地址去拉流。启动后先看日志。正常情况下转换服务会显示类似这样的过程信令服务连接成功。收到 WebRTC 会话请求。SDP 协商完成。ICE 连接建立。开始向 RTMP 服务端 publish。输出流已发布。如果你看到“publish 成功”之类的日志说明转换服务到 RTMP 服务端这一段已经通了。如果没有先看 RTMP 地址、端口和鉴权参数是否正确。3.3 从浏览器发起 WebRTC 流转换服务起来之后再打开项目自带的 WebRTC 推流页面。如果项目里有示例 Demo一般会提供一个“开始推流”按钮。点击之后浏览器会请求摄像头或麦克风权限。如果测试的是屏幕分享还要在浏览器的分享弹窗里选择屏幕或窗口。推流启动后回到转换服务日志观察是否出现新的会话记录。如果日志里能看到收到媒体包的计数说明 WebRTC 推流端已经和转换服务建立了媒体连接。这里要特别注意浏览器推流页面不能随便放在一个 HTTP 域名下。如果页面不是 localhost浏览器很可能因为非安全上下文而拒绝获取音视频设备。这会表现为“点击按钮没反应”或者“权限弹窗一闪而过”。3.4 播放验证推流成功后用播放端拉流验证。最简单的命令是ffplay rtmp://127.0.0.1:1935/live/test如果没安装 ffplay也可以用 VLC 打开网络流输入相同地址。能出画面、有声音说明整条链路已经通了一半。还可以用 HTTP-FLV 再验证一次。如果 RTMP 服务端开启了 HTTP-FLV播放地址会形如ffplay http://127.0.0.1:8080/live/test.flv具体端口以你的服务端配置为准。HTTP-FLV 验证有一个好处它能说明 RTMP 服务端已经把流转换成浏览器可以直接播放的协议格式这对后续接入 Web 播放器很有参考价值。4. 测试用例、参数和验收标准4.1 从低参数开始跑第一次跑通不要用 4K、不要用超高码率、不要开多路并发。我一般会先把参数控制在一个稳妥范围参数建议初值说明分辨率640x360 或 1280x720先验证链路不验证画质上限码率1 到 2 Mbps避免网络波动干扰判断帧率15 到 30 fps太低可能掩盖编码问题视频编码H.264RTMP 兼容性最好音频采样率48000WebRTC 常用音频参数推流路数1 路先不要做并发为什么要先用低参数因为链路调试时变量越少越好。用 720p、2Mbps、25fps 跑通比用 1080p 高码率更容易区分“协议问题”和“性能问题”。如果你的测试机器比较老或者用的是虚拟机更要压低分辨率和码率。机器配置偏低的情况下转封装服务可能因为 CPU 转码或者内存不足而卡顿。这个锅不能甩给协议转换本身。4.2 不要只看“能不能出画面”能出画面只是一个最低标准。测试环境要验证的内容还包括画面是否花屏或花帧。声音是否清晰是否有卡顿。音画是否同步。播放端延迟是否一直涨。长时间运行后内存和 CPU 是否异常上升。判断音画同步不需要精确仪器可以用手机计时器或者画面里放一个秒表录制一小段播放时看画面和声音是否对得上。这个办法很土但在测试环境里足够暴露明显的同步问题。延迟也是一个重要判断点。WebRTC 本身是低延迟协议但经过转换服务和 RTMP 分发后延迟会明显比 WebRTC 高。不要用 WebRTC 的延迟预期来要求 RTMP 链路。你要关注的是延迟是否稳定而不是绝对数值是否最小。4.3 长期稳定性测试单次推一个 30 秒的视频能出画面不代表服务稳定。我建议至少跑一轮 30 分钟的连续推流观察这几个指标指标判断标准内存占用是否持续上涨停止推流后是否回落CPU 占用是否长期跑满是否有明显抖动网络连接TCP 连接是否异常断开日志数量是否频繁报错、重连播放端是否出现长时间卡顿或黑屏如果 30 分钟还看不出来问题可以继续跑一小时。但一般测试环境里30 分钟已经能暴露大部分连接不稳定、内存泄漏和日志风暴问题。4.4 建议整理的测试用例开发阶段的测试环境不需要一次把所有场景跑完但至少要有下面几类用例单路浏览器推流验证最小链路。切换分辨率或码率验证参数变化。纯视频无音频验证音频缺失时是否影响推流。推流中途断网或关闭页面验证服务是否能正常释放资源。掉线后重新推流验证新会话是否覆盖旧会话。为什么要有这些用例因为转换服务最容易出问题的点不只是协议转换还有状态管理。旧会话没有释放、新会话推不进去、日志里出现大量残留连接这些都是在多次推流和断流之后才会暴露的。5. 常见失败和排查顺序5.1 连接成功但无画面这是 webrtc2rtmp 测试环境里最常见的问题。现象是推流端显示已连接转换服务也有会话日志但播放端没有任何画面。我建议先看编码格式。WebRTC 推流端可能使用的是 VP8 或 VP9而 RTMP 服务端或播放器不支持导致画面出不来。可以在转换服务配置里要求推流端使用 H.264或者在转换服务里做转码。具体用哪种方式看项目设计。还有一种情况是 SDP 协商里没有正确协商出视频轨。很多项目支持纯音频推流如果你测试时只授权了麦克风没有授权摄像头播放端当然没有画面。5.2 有画面但没声音有画面没声音通常不是网络问题而是音频编码不匹配。WebRTC 默认音频编码常用 Opus但 RTMP 服务端和播放器对 Opus 的支持不一定完整。有些测试环境里播放端能解码 H.264 视频却无法解码 Opus 音频。这时需要检查转换服务是否把 Opus 转成 AAC或者播放端是否支持对应音频格式。判断方法很简单先用 VLC 播放看播放器日志里有没有音频解码相关报错。再用 ffprobe 查看流信息ffprobe rtmp://127.0.0.1:1935/live/test输出里会显示视频编码和音频编码。看到音频编码不是预期值问题基本就定位了。5.3 延迟越来越高RTMP 播放延迟逐渐上涨常见原因不是协议转换本身而是播放端缓冲策略和服务端缓存配置。测试时可以先查看播放端是否在持续缓存。如果延迟稳定在一个固定值说明是正常缓冲如果延迟一直线性上涨可能是播放器没有正确消费数据也可能是服务端 FLV 缓存队列过长。这个时候不要急着改转换服务的参数先确认是拉流端问题还是推流端问题。可以换一个播放器验证比如从 VLC 换成 ffplay或者从 RTMP 换成 HTTP-FLV。如果换完延迟恢复正常说明问题在播放器或协议选择上而不在 webrtc2rtmp 转换链路里。5.4 推流端频繁断连推流端频繁重连先看网络环境再看防火墙。WebRTC 对 UDP 端口要求比较敏感。如果防火墙只开放了 1935WebRTC 媒体包可能无法到达转换服务导致推流端不断重试。其次NAT 环境下如果 STUN 和 TURN 配置不完整也会导致连接不稳定。我一般会分两步排查第一步看信令服务日志是否正常第二步用抓包工具或tcpdump看 UDP 包是否到达服务器。如果 UDP 包到了再往上查转换服务是否正确处理。如果 UDP 包根本没到重点检查防火墙、安全组和 UDP 端口映射。5.5 我建议的排查顺序遇到问题不要先把参数改来改去。先按顺序排查看现象是黑屏、花屏、没声音、断连还是延迟上涨。看服务和推流端日志找出第一条异常日志。看网络连接确认 1935 和 WebRTC UDP 端口是否连通。看媒体编码用ffprobe检查实际输出流的编码格式。看资源占用CPU、内存、磁盘是否异常。看安全策略SELinux、AppArmor、防火墙是否拦截了服务。这个顺序看上去简单但很管用。很多“webrtc2rtmp 转换失败”的报错最后查出来是 RTMP 地址填错、防火墙没开 UDP 端口或者推流页面没有使用 HTTPS。6. 测试环境验收清单和后续扩展6.1 测试环境验收清单一个 webrtc2rtmp 测试环境能不能算搭完我建议按这个清单验收[ ] RTMP 服务端能正常启动1935 端口在监听。[ ] 转换服务能连接信令服务日志里没有明显报错。[ ] 浏览器推流成功后转换服务能看到媒体会话。[ ] 播放端能通过 RTMP 地址拉到流。[ ] 播放端能通过 HTTP-FLV 地址拉到流。[ ] 画面和声音正常音画同步可接受。[ ] 连续推流 30 分钟内存和 CPU 没有异常增长。[ ] 关闭推流页面后服务能释放会话日志里的连接数回落。[ ] 重启转换服务后重新推流能正常恢复。这份清单不一定需要一次全部通过但每一条都应该能明确回答“通过了”还是“没通过”。不要用“好像能出画面”这种模糊结论来验收。6.2 从单路测试到并发和多路流单路链路跑通之后很多人会立刻想并发测试。我的建议是先不要开太多路。并发测试前先确认三件事转换服务是否支持多路会话。RTMP 服务端是否支持多路 publish。你的测试机器 CPU、内存、带宽是否够用。如果这三项都满足再逐步增加并发路数。从 1 路加到 2 路再到 5 路每次都要观察 CPU、内存、日志和播放端稳定性。不要一次性加到 20 路否则出了问题根本分不清是哪一路导致的。并发场景里更常见的问题不是协议转换而是资源分配。比如每路会话的内存泄漏、日志文件无限增长、RTMP 服务端连接数达到上限。这些都需要通过测试环境提前暴露。6.3 建议补充自动化验证如果这个测试环境要长期使用建议把重复操作脚本化。至少可以写一个简单的测试脚本完成三步启动 RTMP 服务端。启动转换服务。自动发起一路 WebRTC 推流。自动化脚本不需要一开始做得很完整能帮你减少手动操作的重复性就好。真正重要的是每次测试的步骤和参数保持一致。这样当问题出现时你能复现也能对比。测试过程中所有服务的关键日志最好统一放到一个目录下并在日志里带上时间戳。我看到不少项目失败不是因为功能不行而是因为日志分散在多个终端窗口里出问题后很难拼出完整调用链。6.4 生产化前要考虑的边界最后说一个边界问题。测试环境能跑通不代表生产环境一定能稳定运行。webrtc2rtmp 转换服务如果要从测试走向生产至少还要考虑这些事推流地址的鉴权与流名称策略。RTMP 服务端的集群和持久化配置。转换服务的高可用和故障转移。会话级监控指标例如在线路数、推流时长、错误码。日志采集和告警。这些不是测试环境阶段必须解决的问题但你在搭测试环境时就要留出扩展空间。比如测试环境里尽量用配置项管理 RTMP 地址而不是写死在代码里日志尽量按日期切分而不是无限写到同一个文件。很多人会在测试环境里为了省事把防火墙关掉、把日志级别调到最低、把所有服务跑在 root 权限下。短期看确实省事但长期看这些操作会让测试环境的结论失真。一个在关闭防火墙的 root 容器里跑通的链路到了真实部署环境里往往第一轮就翻车。我个人更建议先把单路最小链路跑稳再逐步加参数、加并发、加自动化验证。webrtc2rtmp 测试环境最怕的不是功能不支持而是链路里有一环你没有看到。把每一环的日志和验证标准都记录下来测试环境的真正价值才能发挥出来。
返回列表