5 分钟拿到你的监控设备直播地址:HLS、FLV 与低延迟播放怎么选(实战对比)

5 分钟拿到你的监控设备直播地址:HLS、FLV 与低延迟播放怎么选(实战对比)


接入乐橙设备的第二周,前端同学 @ 我:「接口都 200 了,播放器还在转圈。」查日志才发现,后端把 HLS 地址当 FLV 喂给了 flv.js——协议错了,签名再对也没用。那天我们定下规矩:先选播放协议,再调 OpenAPI;很多「拿不到直播」的问题,其实是路走错了。


为什么「拿直播地址」值得单独写一篇

设备绑定、listDeviceDetailsByPage 同步资产——只是让系统知道「有哪路通道」。真正面向用户播放,还要再跨一步:按协议签发可播放 URL。乐橙开放平台在「设备直播」模块里提供了多条现行路径(均属当前维护的 OpenAPI,不要去抄「旧版本协议」栏目里的过期接口):

诉求典型场景平台侧常见路径
Web/H5 快速出画监控大屏、轻量预览HLSbindDeviceLive / getLiveStreamInfo
低延迟 Web、小程序互动、多路墙FLVcreateDeviceFlvLive
对讲、小程序推流考管喊话、小程序 live-pusherRTMPcreateDeviceRtmpLive,常与 FLV 组合)
亚秒级、端上预览App、私有化集成OpenSDK / 私有协议(非本文 HTTP 一键 URL)

社区里常把 WebRTC 和上面几种混为一谈。需要先说清边界:现行 OpenAPI 直接返回的是 HLS、FLV、RTMP 等地址;若你要浏览器里 WebRTC 级别的延迟,通常要走 SDK 拉私有流,或在自建网关把 RTSP/FLV 再转 WebRTC——这是架构选型,不是某一个 bindXxx 多传一个参数的事。

三条 HTTP 路线的关系(一张表记住)

                    ┌─ bindDeviceLive ──▶ 单路 HLS(指定主/辅码流)
  accessToken ───────┼─ getLiveStreamInfo ▶ 该通道已创建直播的全量 HLS(主/辅、http/https)
                    ├─ createDeviceFlvLive ▶ flv / flvHD(实时或录像回放)
                    └─ createDeviceRtmpLive ▶ rtmp / rtmpHD(小程序、对讲推流)

官方说明:bindDeviceLive 创建设备源直播时,后台会默认准备主码流、辅码流、HTTP/HTTPS 等多套地址,该接口响应里只带回当前所选码流的 HLS;要看全量,再调 getLiveStreamInfo

开发总览里对各集成方式的延迟有量级对比(云直播 HLS 往往 3~8 秒;轻应用、私有协议更低)。选型时别只比「哪个接口少写两行代码」,要比 延迟、并发、终端兼容性

我们的原则

  1. 密钥与签名只在服务端——客户端只拿短时播放 URL 或自家会话 token。
  2. 地址不当长期资产——泄露即裸播;跟业务会话绑定,结束即废引用。
  3. bindDeviceLive 再查——未创建直播就调 getLiveStreamInfo,容易空数据(踩坑见下)。

0. 前置:令牌 + 设备在线(1 分钟)

播放前确认:listDeviceDetailsByPage 里目标 deviceIddeviceStatusonline,通道 channelStatusonline。令牌用缓存好的管理员 accessToken,别每个观众请求都刷新。

方式一 · HLS:5 分钟出第一帧(最常用)

Step 1 — 创建直播

const live = await platformCall('bindDeviceLive', {
  token,
  deviceId: 'TESTQWERXXXX',
  channelId: '0',
  streamId: 1,      // 0 高清主码流,1 标清辅码流
  liveMode: 'proxy',
});
const hls = live.streams?.[0]?.hls;

成功标志:result.code === '0'streams[0].hls 为非空 m3u8 地址。

Step 2 — 需要主/辅、HTTP/HTTPS 全量时

const info = await platformCall('getLiveStreamInfo', {
  token,
  deviceId: 'TESTQWERXXXX',
  channelId: '0',
});
// info.streams[]:多条 hls、streamId、status、liveToken、coverUrl

status 字段可用来排障(文档定义:0/1 直播中,2 视频源异常,3 码流转换异常等)——我们曾遇到「有 URL 但黑屏」,查到这里是 3,转去查设备侧码流。

Step 3 — 前端

HLS 用 hls.js(非 Safari)或原生 video(Safari)。不要把 m3u8 当 flv 播。

维度HLS
延迟相对较高,适合监看、录播预览
兼容Web 最省心,CDN 友好
接口bindDeviceLive + 可选 getLiveStreamInfo
踩坑未先 create;HTTPS 页面拉 HTTP 流被浏览器拦截

方式二 · FLV:要低延迟 Web 时的首选 OpenAPI

const flv = await platformCall('createDeviceFlvLive', {
  token,
  deviceId: 'TESTQWERXXXX',
  channelId: '0',
  type: 'realTime',   // realTime 实时;playback 录像回放
});
// flv.flv 标清,flv.flvHD 高清

回放直播(同一接口,参数不同):

await platformCall('createDeviceFlvLive', {
  token,
  deviceId, channelId,
  type: 'playback',
  beginTime: '2026-05-01 10:00:00',
  endTime: '2026-05-01 11:00:00',
  recordType: 'cloudRecord', // 或 localRecord
  speed: 2,
});
维度FLV
延迟通常优于 HLS,适合多路墙、互动
兼容浏览器需 flv.js 等;小程序文档也提到 FLV + live-player
接口createDeviceFlvLive
踩坑地址带 expire/digest,过期要重新签发

我们监考墙从 HLS 改 FLV 后,首帧时间明显缩短,但 CPU(软解)上升,弱终端要限路数。

方式三 · 「WebRTC」预期:OpenAPI 不直接给 SDP 时怎么办

这是被问最多的问题。诚实结论:

OpenAPI 直出:HLS / FLV / RTMP
WebRTC 级体验:OpenSDK 实时预览(私有协议,延迟更低)
浏览器 WebRTC:自建 media server 转码,或官方轻应用/播放器组件

若产品 PRD 写「必须 WebRTC」,工程上通常是:

  1. App / 桌面:集成 OpenSDK 实时预览(标准化 Demo 里有预览、对讲示例),不走 m3u8。
  2. Web 要强互动createDeviceFlvLive + flv.js 先满足;仍不够再评估网关转 WebRTC(成本自担)。
  3. 小程序:文档路径是 FLV 拉流 + RTMP 推流对讲createDeviceRtmpLive,对讲时 isTalk: true),不是标准 WebRTC 信令那套。

对比表(选型用,非benchmark):

协议/路径获取方式典型延迟感Web 浏览器备注
HLSbindDeviceLive / getLiveStreamInfo较高★★★★★最先跑通
FLVcreateDeviceFlvLive中低★★★★(需 flv.js)多路墙常用
RTMPcreateDeviceRtmpLive★★(flash 已死,多给小程序/推流)对讲推流
SDK 私有流OpenSDK需封装非 HTTP 一键 URL
WebRTC自建或组件最低视方案非 OpenAPI 直接返回

5 分钟实操清单(复制到 Wiki)

□ 应用 appId/appSecret 已配置在后端
□ accessToken 有效
□ 设备、通道在线(分页列表可查)
□ bindDeviceLive(streamId=1) → 得到 hls
□ 浏览器或 hls.js 能播
□ 若要 FLV:createDeviceFlvLive(type=realTime) → flv.js 能播
□ 若要全量 HLS:getLiveStreamInfo 核对 status=0/1
□ 播放地址不入库长期明文;会话结束丢弃

踩坑实录

现象原因处理
getLiveStreamInfo 空未先 bindDeviceLive先创建再查
有 hls 黑屏 status=3码流转换异常换 streamId、查设备在线与带宽
HTTPS 页无法播混合内容用 https 的 hls(getLiveStreamInfo 里常有)
flv 403地址过期重新 createDeviceFlvLive
并发卡顿同账号多路超限辅码流 + 限路 + 轮巡
抄旧文档调不通旧版协议接口改用设备直播模块现行 API

后端统一封装(一种协议一个方法)

async function issuePlayUrl({ protocol, deviceId, channelId, hd }) {
  const token = await getAdminToken();
  if (protocol === 'hls') {
    const d = await platformCall('bindDeviceLive', {
      token, deviceId, channelId: String(channelId),
      streamId: hd ? 0 : 1, liveMode: 'proxy',
    });
    return { type: 'hls', url: d.streams[0].hls, liveToken: d.liveToken };
  }
  if (protocol === 'flv') {
    const d = await platformCall('createDeviceFlvLive', {
      token, deviceId, channelId: String(channelId), type: 'realTime',
    });
    return { type: 'flv', url: hd ? d.flvHD : d.flv };
  }
  throw new Error('webrtc 请走 SDK 或自建网关');
}

安全

文档强调:直播地址泄露可被直接观看。我们做法:播放 URL 只出现在短时 API 响应;审计「谁何时打开了哪路」;禁止把 m3u8/flv 写进静态配置。

性能与并发

  • 多路场景优先 辅码流streamId: 1 或 flv 标清)。
  • 账号级 播放并发带宽 有额度,大促/统考前与运营核对。
  • getLiveStreamInfo 适合「详情页拉全量」,不适合「每秒轮询」。
  • 设备解绑会 自动删除 直播地址,换机要重新 bind。

与云直播、轻应用的关系

平台还有 云直播、轻应用组件、JS 播放组件 等更低代码路径——适合 PoC。自研后端仍建议掌握 bindDeviceLive / createDeviceFlvLive 这条 HTTP 链路,便于和自有权限、计费、会话系统耦合。


小结

「5 分钟拿到直播地址」在官方平台,现实路径是:令牌 → 确认通道在线 → bindDeviceLive 出 HLS;要低延迟 Web 加 createDeviceFlvLive;要全量 HLS 用 getLiveStreamInfoWebRTC 则要在 OpenAPI 之外另选 SDK 或自建转码——不是接口名写错,而是协议栈本来不同。

官方开放平台以视频技术与安全为核心,提供低代码组件与 OpenAPI,帮助开发者较低成本落地监控、直播、巡检等视频场景。若你刚绑定第一台设备,建议按本文清单先播通一路 HLS,再在同一后端封装 FLV,最后按产品延迟要求决定是否上 SDK 或网关。

注册与接口说明:在 开放平台完成开发者注册并创建应用,于控制台获取密钥;在平台 在线开发文档 中搜索「设备直播说明」「创建设备源直播地址」「创建设备 flv 直播地址」「查询直播信息」等章节核对参数。以上为实践笔记,生产以最新文档为准。
官网链接:https://open.imou.com/?article_id=AjCcWEJphwmokszy


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值