ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

大疆无人机RTMP推流与Web直播回放:从nginx-rtmp到LiveQing实践

2026/9/8 20:41:28 拓冰建站 浏览量
大疆无人机RTMP推流与Web直播回放:从nginx-rtmp到LiveQing实践 先讲个我自己接过的项目。有一次客户要求把大疆无人机画面实时接到他们的官网领导在办公室打开网页就能看到现场还要能回放两小时前的飞行画面。我第一反应是老一套拿一台服务器装 nginx-rtmp配好转发再用 video.js 写个播放页面。结果做到一半就发现事情没那么简单——nginx-rtmp 只是一个转发模块没有录像管理、没有播放器集成、没有鉴权回放更是要自己写一套时间轴逻辑。折腾了一周最后换成了 LiveQing 流媒体平台一天之内把无人机 RTMP 推流、Web 网页直播、录像回放整条链路全部打通。这篇文章就是把这次落地过程完整拆开来讲适合正在做无人机直播、安防巡检直播、景区慢直播或者想把任意 RTMP 设备接入网页直播的开发者、运维和项目负责人。你会看到完整的部署步骤、无人机端配置方法、播放协议选型逻辑以及我在实践中踩过的一堆坑尤其是 opencv 打开 rtmp 失败和画面反复掉线这两类问题。1. 从nginx-rtmp到LiveQing先说说我为什么不建议纯手工搭直播链路1.1 nginx-rtmp方案的真实体验nginx-rtmp 是 nginx 的一个第三方模块作用很简单接收 RTMP 推流然后对外输出 RTMP、HTTP-FLV、HLS 这些流。它本身不是一个完整的直播系统更像一个“流转发管道”。如果你的需求只是自己用 VLC 拉个流看看那完全够用。但一旦涉及到业务场景麻烦就来了。我在项目里实际遇到的几个问题可以列出来给你参考。第一没有录像管理能力。nginx-rtmp 虽然能通过 record 指令把流切成 flv 或者 mp4 文件存到磁盘但它只管“存”不管“查”。没有录像列表接口没有按时间点回放的时间轴没有录像文件的生命周期管理。想实现“回放两小时前的画面”这种需求我得自己写定时任务去扫描目录、生成 m3u8 索引、再写一个前端时间轴组件。第二没有播放器。nginx-rtmp 只负责把流切好页面里的播放器要自己找、自己嵌、自己处理各种兼容性。第三没有鉴权和设备管理。谁可以推流、谁可以观看、流是哪个设备推上来的这些东西在纯 nginx-rtmp 里全都没有。当年我甚至见过有人直接把 rtmp 地址写在网页源码里任何人都能往里推流捣乱。不是说 nginx-rtmp 一无是处它很适合用来学习 RTMP 协议本身或者做纯内网的低负载测试。但你要给客户交付一个“能看直播、能选时间回放、能管理多个设备”的产品手工搭的链路会变成一个无底洞。这也是我后来转向 LiveQing 这类流媒体平台的根本原因。1.2 LiveQing这类平台解决的是整条链路LiveQing 的本质是一套流媒体服务软件把“接收推流、协议转换、Web播放、录像存储、回放管理、API对接”打包成了一个开箱即用的系统。你不需要关心 RTMP 流进来之后怎么切片、怎么生成 HLS、怎么管理录像文件这些平台内部都做好了你只需要关心业务逻辑。从架构上看它其实是替代了传统方案里“nginx 录像脚本 播放器 管理后台”这一整套东西。对于无人机场景价值尤其明显无人机推上来的 RTMP 流进到平台后自动生成 HTTP-FLV 和 HLS 两种播放地址。HTTP-FLV 延迟低适合网页实时观看HLS 兼容性好适合录像回放和跨平台分发。平台自带的 Web 管理界面自带播放器和录像时间轴不需要单独开发前端。这里要补充一个概念RTMP 协议本身是一种基于 TCP 的流媒体传输协议特点是推流端生态非常成熟。大疆无人机、OBS、FFmpeg、各种编码器几乎都原生支持 RTMP 推流。但 RTMP 有一个天然短板它默认的 1935 端口在浏览器里不能直接播放必须转成 HTTP-FLV 或者 HLS 才能在网页端观看。LiveQing 做的事情之一就是这个转换而且转换过程是全自动的。所以在选型上我的结论很明确如果你的项目是做一个长期的、面向客户的直播业务直接用流媒体平台别在 nginx-rtmp 上浪费时间。如果你的需求只是验证一下协议或者临时拉个流看一眼那 nginx-rtmp 可以用但别把它当成正式方案的一部分。2. LiveQing部署与RTMP接入验证先把“能不能推”跑通2.1 部署方式与端口规划LiveQing 部署起来不算复杂常见的方式是 Docker 部署和安装包部署两种。我自己更推荐 Docker因为升级回滚都方便数据目录挂载到宿主机出了问题不会污染系统环境。以 Docker 方式为例整体逻辑大致是这样把 Web 服务端口、RTMP 接收端口、数据存储目录通过参数映射出来。RTMP 默认端口是 1935Web 管理端口可以根据内网情况自定义。部署完成后LiveQing 会同时承担三件事接收 RTMP 推流、对外提供 HTTP-FLV/HLS 播放、管理录像文件。端口规划这里要提醒一句如果你要放到公网环境只开放必要的端口就够了。1935 端口是 RTMP 推流用的80/443 是 Web 页面和 HTTP-FLV/HLS 播放用的。不要把服务器的所有端口都暴露出去也不要用 1935 之外的随机端口做推流因为很多无人机 App 的 RTMP 推流功能对非标准端口兼容性不好。存储目录的规划同样重要。录像文件会持续增长尤其是无人机长时间飞行时每小时可能产生几个 GB 的数据。我习惯把数据目录单独挂到一块大容量磁盘或者 NAS 上避免系统盘被写满导致整个服务崩溃。2.2 用FFmpeg做推流连通性测试部署完成之后先别急着上无人机。我的习惯是先用 FFmpeg 在本地推一个测试流把平台这一侧的链路先验证通再让硬件设备上场。因为硬件设备一旦出了问题排查链路会复杂很多先用软件排除平台问题是最省时间的做法。FFmpeg 推流命令很简单核心是-re参数按原始帧率读取文件-f flv指定输出格式为 FLV后面的地址就是 LiveQing 的 RTMP 接收地址ffmpeg -re -stream_loop -1 -i test.mp4 -c copy -f flv rtmp://192.168.1.100:1935/live/test001这里-stream_loop -1的意思是无限循环播放同一个文件适合做长时间稳定性测试。推流之后打开 LiveQing 的管理界面如果能看到test001这个流处于在线状态说明平台已经成功接收到了 RTMP 流。这时候再用播放器验证一下能不能拉流播放。在 LiveQing 后台复制 HTTP-FLV 地址用 VLC 打开能出画面就说明推拉流整条链路是通的。我用这种方式验证整个流程一般在五分钟以内就能完成。2.3 没有现成视频源时怎么造一个测试流很多人在部署完平台后手边没有现成的 RTMP 推流源这时候可以用 FFmpeg 生成一个测试画面不用找一个视频文件。比如用一个颜色渐变或者测试图案作为视频源再加一条测试音频轨推流出去就能在播放端看到画面验证效果非常直观。ffmpeg -re -f lavfi -i testsrc2size1280x720:rate30 -f lavfi -i sinefrequency1000:sample_rate44100 -c:v libx264 -preset ultrafast -tune zerolatency -c:a aac -f flv rtmp://192.168.1.100:1935/live/test002这条命令用 FFmpeg 内置的 testsrc2 图案作为视频源sine 信号作为音频源实时编码成 H.264 AAC 推流。-tune zerolatency对降低编码延迟有很大帮助这个参数在后面无人机项目里也会用到。这个测试流的优势是完全脱离硬件设备适合在平台搭建初期做链路验证和网络排查。3. 大疆无人机端配置与推流参数从遥控器到服务器3.1 无人机直播的原理和机型支持情况大疆无人机推 RTMP 直播的原理简单说就是无人机相机采集画面后机内芯片完成 H.264/H.265 编码再通过图传链路发到遥控器或手机 AppApp 端把视频流封装成 RTMP 协议通过 4G/5G/Wi-Fi 网络推到流媒体服务器。所以整个链路里真正负责“推流”的是遥控器或手机上的 DJI Fly App而不是飞机本身。机型方面大疆目前主流的消费级机型比如 Mavic 3 系列、Mini 3 Pro、Air 2S 等在 DJI Fly App 的直播设置里都有“自定义 RTMP”选项。打开这个选项之后可以看到一个填写推流地址的输入框。行业级机型如经纬系列、Mavic 2 行业版的直播配置入口略有不同但底层原理一样都是填 RTMP 地址。有一点要特别提醒不要以为所有大疆机型都支持自定义 RTMP 推流。一些入门级或旧款机型App 里的直播功能只能推到官方平台没有自定义地址入口。入手之前先去 DJI Fly App 的直播选项里看一眼确认有没有“自定义 RTMP”或者“RTMP 推流”的入口再决定项目方案。3.2 遥控器端完整配置步骤这里以带屏遥控器或手机连接遥控器两种方式为例步骤基本一致。第一步把无人机起飞让图传画面出现在 DJI Fly 主界面上。第二步在图传画面的右下角或设置菜单里找到“直播”图标进入直播设置页。第三步选择直播平台找到“自定义 RTMP”选项点击进入推流地址设置。推流地址的格式是rtmp://服务器IP:1935/live/流名称。流名称推荐使用有业务含义的字符串比如dji_drone_001、inspection_site_a这样在 LiveQing 后台可以一眼分辨是哪个设备推上来的流不需要额外的映射表。填完地址之后大疆 App 会先做一次网络连通性检测然后开始推流。这时候注意观察 LiveQing 后台如果流的在线状态变成“直播中”且码率曲线开始波动说明无人机画面已经成功推到服务器了。我在实际项目中用过的地址形如rtmp://192.168.1.100:1935/live/dji_001。如果无人机和 LiveQing 服务器在同一个局域网Wi-Fi 网络就能推流如果无人机在外场作业遥控器插 4G SIM 卡或连手机热点走公网链路推流。3.3 码率、分辨率和网络带宽的平衡无人机直播最容易翻车的地方不是平台配置而是网络上行带宽撑不住。大疆 App 里一般会提供直播清晰度选项比如 720p、1080p 等。我实测下来的经验是使用 4G 网络推流时720p30fps 2Mbps4Mbps 的码率是最稳的组合在有 5G 或稳定 Wi-Fi 覆盖的现场可以提升到 1080p30fps 4Mbps8Mbps。为什么会这样原因是 RTMP 推流对上行带宽的稳定性要求很高。无人机在飞行过程中位置不断变化4G 信号强度会有抖动如果码率设置得太高一旦网络出现瞬时拥塞就会出现画面花屏、卡顿、甚至推流超时断开的情况。反过来码率太低画面又没法看。所以我的建议是在正式飞行前先在地面悬停测试一次调整好码率观察 LiveQing 后台的码率曲线是否平滑再做正式直播。这里还要注意 H.265 编码的问题。部分大疆机型默认使用 H.265 编码输出H.265 在同等画质下码率更低但 LiveQing 的 Web 播放器对不同编码格式的支持情况不一样。如果发现网页端无法播放无人机推上来的流优先去 App 里把编码方式切换成 H.264这是兼容性最好的方案。4. Web播放与录像回放把直播变成可交付的业务4.1 播放协议选型HTTP-FLV还是HLS无人机推流到 LiveQing 之后平台会生成多种播放地址其中最主要的是 HTTP-FLV 和 HLS 两种。这两个协议各有各的适用场景选择标准其实很清晰。先看延迟需求。HTTP-FLV 的端到端延迟一般在 25 秒适合无人机直播、活动现场、安防监控这类对实时性有要求的场景。HLS 的延迟通常在 515 秒甚至更高但它的兼容性最好iOS 的 Safari 浏览器可以直接播放 HLS不需要任何插件。所以我的建议是网页实时直播用 HTTP-FLV录像回放和慢直播用 HLS。这里可以把两种协议的特点做一个简单对比协议延迟浏览器兼容性适用场景HTTP-FLV2~5秒Chrome/Edge等需flv.jsWeb实时直播HLS5~15秒iOS Safari原生支持录像回放、跨平台分发LiveQing 后台会直接给出每种协议的播放地址和嵌入代码你不用自己拼接。嵌入网页时用平台自带播放器组件即可它内部已经处理好了 flv.js 和 hls.js 的加载逻辑。4.2 录像计划、存储计算与回放页面LiveQing 的录像能力是我选择它的核心原因之一。在后台可以对每一路流设置录像计划比如全天候录制、只在特定时间段录制、按需手动录制。录像文件按时间自动切片回放时通过时间轴选择起止时间就能直接播放。存储空间的估算有一个通用公式录像大小 码率 / 8 × 3600 秒。以 4Mbps 的码率计算每小时产生约 1.8GB 数据一天就是 43GB 左右。如果现场有 3 架无人机同时直播录制一天的数据量会超过 120GB。这个容量在规划服务器磁盘时必须留足否则录像保存天数远远达不到项目要求。回放页面这块LiveQing 提供了完整的管理后台。管理员登录后可以看到每一路流的录像列表点击任意时间段即可回放画面。这套界面是平台自带的不需要额外的前端开发工作。4.3 对外集成把直播和回放嵌入业务系统实际项目中很少有客户愿意直接登录 LiveQing 后台看直播基本都是要求把直播画面嵌到自己的官网、巡检系统或者小程序里。LiveQing 的做法是提供标准 HTTP API 和播放器嵌入代码你只需要在后端调 API 获取播放地址然后传给前端播放器。嵌入式播放器的核心逻辑是前端拿到一个视频流地址HTTP-FLV 或 HLS加载对应的播放器库flv.js 或 hls.js然后开始播放。这个过程相当于把自己业务系统和流媒体平台解耦LiveQing 负责流处理和存储你的系统负责业务交互和权限控制。需要提醒的是如果直播地址不希望被随意扩散可以在平台侧开启播放鉴权或防盗链避免有人直接拿地址去别的网站播放。5. 实测踩坑记录opencv拉流失败、掉线、花屏到底怎么查5.1 opencv打开rtmp失败的原因与处理很多做视觉分析的朋友会在无人机直播链路上加一步用 OpenCV 的 VideoCapture 直接读取 RTMP 流做实时识别。这个方法理论上没问题但我在实际项目里遇到了一个非常典型的失败VideoCapture打开 RTMP 地址一直返回 False用 ffprobe 验证地址却是通的。这个问题的根子在于 OpenCV 自带的 FFmpeg 编译选项。很多 OpenCV 发行版在编译时没有启用 RTMP 支持或者链接的 FFmpeg 版本不含 librtmp。这时候cv2.VideoCapture(rtmp://...)当然打不开流。另外还有一个常见原因是 OpenCV 的 FFmpeg 版本较老对 H.265 编码的 RTMP 流无法解码。我的建议是不要在这一步死磕 OpenCV 编译而是绕开它先用 FFmpeg 命令行把 RTMP 流拉下来转成 MJPEG 或原始帧再喂给 OpenCV 处理。虽然多了一层进程但稳定性和兼容性都好很多。一个参考做法是在服务端写好拉流脚本把 RTMP 转成本地的 UDP 或文件流然后让 OpenCV 去读本地源这样既能保证识别任务稳定运行又规避了 OpenCV 对 RTMP 协议支持不完整的问题。5.2 无人机推流掉线和花屏的排查链路无人机推流是最容易出“看起来哪都对但就是不行”问题的场景。如果你遇到画面反复掉线或者花屏我建议按下面这条链路去排查顺序不能乱。第一步看服务器端的网络流量。登录 LiveQing 所在的服务器执行iftop或者nload观察 1935 端口的实时流量是否稳定。如果流量忽高忽低甚至直接掉到零问题九成在推流端网络不在平台。无人机在快速移动时 4G 信号切换基站很容易出现这种状况。第二步看 LiveQing 后台的错误日志。推流断开一般会留下 RTMP 握手失败、会话超时这类记录这些日志能帮你快速定位是网络中断还是推流地址被其他设备顶掉了。第三步看编码设置。如果画面花屏且伴随马赛克通常是因为网络带宽不足导致编码器丢帧严重这时候把码率降一档或者把编码从 H.265 切换为 H.264情况基本都能改善。还有一个非常隐蔽的坑多台设备用了同一个推流流名称。RTMP 协议的特性是同一时刻一个流名称只能被一个推流端占用第二台设备推流时要么推不进去要么直接把第一台设备顶下线。在无人机项目里尤其容易发生——现场设备重启后自动推流跟上一台设备撞了名字。所以流名称规划一定要保证唯一性最好用设备序列号或 UUID 后缀。5.3 并发观看、鉴权与数据安全的实际考量最后说一下平台上线前需要关注的几个层面的问题。第一是并发观看能力。HTTP-FLV 和 HLS 分发本质上都是服务器往外吐带宽一个 1080p 的流按 4Mbps 下行算100 个观众同时看就是 400Mbps 的出口带宽。这个数字在公网服务器上要提前算好否则画面一多人就卡。局域网环境问题不大公网环境一定要跟运维确认带宽上限。第二是鉴权配置。如果直播流地址是明文写在网页里的别人复制到任何播放器都能看。LiveQing 这类平台一般都会提供播放鉴权、时间戳防盗链之类的功能对外交付时务必开启避免直播内容被恶意抓取。第三是录像数据的备份和清理策略。录像文件是持续增长的平台一般都有自动清理过期录像的配置。按项目要求设置保存周期既满足回放需求又不会把磁盘写满。还有一点是平台自身的升级和备份。我的习惯是每周或者每次重要活动前把 LiveQing 配置数据库和主要录像目录做一次增量备份放到独立存储上。虽然流媒体系统整体比较稳定但真遇到磁盘故障或者配置误操作时一份完整的备份能让你少熬几个通宵。我做了好几个无人机直播项目之后最大的体会是硬件设备推流到流媒体平台这条链路真正的成本不在服务器搭建而在排障。你在部署完 LiveQing 之后先在整个链路每个环节都验证一遍——FFmpeg 推流、VLC 拉流、无人机推流、网页播放、录像回放——全部跑通之后再做正式业务就不会出现活动当天手忙脚乱的情况。还有一个值得尝试的扩展方向是把录像回放和 AI 识别结合起来比如对无人机录制的视频做目标检测在回放画面上标注异常事件这样直播平台的录像能力就不仅仅是“事后查看”而是能成为业务决策的一部分。