5 分钟拿到你的监控设备直播地址:HLS、FLV 与低延迟播放怎么选(实战对比)
接入乐橙设备的第二周,前端同学 @ 我:「接口都 200 了,播放器还在转圈。」查日志才发现,后端把 HLS 地址当 FLV 喂给了 flv.js——协议错了,签名再对也没用。那天我们定下规矩:先选播放协议,再调 OpenAPI;很多「拿不到直播」的问题,其实是路走错了。
为什么「拿直播地址」值得单独写一篇
设备绑定、listDeviceDetailsByPage 同步资产——只是让系统知道「有哪路通道」。真正面向用户播放,还要再跨一步:按协议签发可播放 URL。乐橙开放平台在「设备直播」模块里提供了多条现行路径(均属当前维护的 OpenAPI,不要去抄「旧版本协议」栏目里的过期接口):
| 诉求 | 典型场景 | 平台侧常见路径 |
|---|---|---|
| Web/H5 快速出画 | 监控大屏、轻量预览 | HLS(bindDeviceLive / getLiveStreamInfo) |
| 低延迟 Web、小程序 | 互动、多路墙 | FLV(createDeviceFlvLive) |
| 对讲、小程序推流 | 考管喊话、小程序 live-pusher | RTMP(createDeviceRtmpLive,常与 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 秒;轻应用、私有协议更低)。选型时别只比「哪个接口少写两行代码」,要比 延迟、并发、终端兼容性。
我们的原则
- 密钥与签名只在服务端——客户端只拿短时播放 URL 或自家会话 token。
- 地址不当长期资产——泄露即裸播;跟业务会话绑定,结束即废引用。
- 先
bindDeviceLive再查——未创建直播就调getLiveStreamInfo,容易空数据(踩坑见下)。
0. 前置:令牌 + 设备在线(1 分钟)
播放前确认:listDeviceDetailsByPage 里目标 deviceId 的 deviceStatus 为 online,通道 channelStatus 为 online。令牌用缓存好的管理员 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」,工程上通常是:
- App / 桌面:集成 OpenSDK 实时预览(标准化 Demo 里有预览、对讲示例),不走 m3u8。
- Web 要强互动:
createDeviceFlvLive+ flv.js 先满足;仍不够再评估网关转 WebRTC(成本自担)。 - 小程序:文档路径是 FLV 拉流 + RTMP 推流对讲(
createDeviceRtmpLive,对讲时isTalk: true),不是标准 WebRTC 信令那套。
对比表(选型用,非benchmark):
| 协议/路径 | 获取方式 | 典型延迟感 | Web 浏览器 | 备注 |
|---|---|---|---|---|
| HLS | bindDeviceLive / getLiveStreamInfo | 较高 | ★★★★★ | 最先跑通 |
| FLV | createDeviceFlvLive | 中低 | ★★★★(需 flv.js) | 多路墙常用 |
| RTMP | createDeviceRtmpLive | 中 | ★★(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 用 getLiveStreamInfo。WebRTC 则要在 OpenAPI 之外另选 SDK 或自建转码——不是接口名写错,而是协议栈本来不同。
官方开放平台以视频技术与安全为核心,提供低代码组件与 OpenAPI,帮助开发者较低成本落地监控、直播、巡检等视频场景。若你刚绑定第一台设备,建议按本文清单先播通一路 HLS,再在同一后端封装 FLV,最后按产品延迟要求决定是否上 SDK 或网关。
注册与接口说明:在 开放平台完成开发者注册并创建应用,于控制台获取密钥;在平台 在线开发文档 中搜索「设备直播说明」「创建设备源直播地址」「创建设备 flv 直播地址」「查询直播信息」等章节核对参数。以上为实践笔记,生产以最新文档为准。
官网链接:https://open.imou.com/?article_id=AjCcWEJphwmokszy
485

被折叠的 条评论
为什么被折叠?



