ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

萤石开放平台音视频接入实战:从OpenAPI到业务系统集成全攻略

萤石开放平台音视频接入实战:从OpenAPI到业务系统集成全攻略 我们实际做项目的时候经常遇到一个很尴尬的场面客户的摄像头、硬盘录像机都装好了画面在厂家自己的App里也正常但要把它接进我们自己开发的业务系统里就完全不知道从哪下手。去年我帮一个连锁茶饮品牌做巡店后台总部想看全国几十家门店的实时画面还想把门店录像按时间段调出来对账。一开始我的方案是每个门店用RTSP拉流自己搭流媒体服务器去转发结果刚跑到第5家门店就出问题——跨网段的摄像头拉不到流公网带宽被占满播放端在弱网环境还卡成PPT。后来换成萤石开放平台的音视频能力用OpenAPI拿直播地址和回放地址前端直接用播放器渲染几天时间就把demo跑通了。这篇文章我就以“产品概述”的视角把我对萤石开放平台音视频这套东西的理解、接入思路、实际踩过的坑一次说清楚。这套产品说白了就是把摄像头、硬盘录像机等设备接入萤石云平台帮你完成音视频的传输、转封装、存储和分发你只需要通过API接口拿地址或者直接集成SDK就能在自有系统里完成实时预览、录像回放、语音对讲这些功能。它适合谁用做SaaS平台的人、做连锁门店管理的人、接监控项目的外包开发、还有想在自己产品里内嵌安防能力的团队都能从中找到成本最低的那条路。1. 萤石开放平台音视频到底是什么1.1 从设备到播放页平台替你省掉了哪些环节传统做法里一台网络摄像头要出画面至少得走过这几步设备端RTSP拉流、转发给流媒体服务器、服务器转成HLS或RTMP、再分发给播放端。中间还牵扯公网端口映射、DDNS、带宽调度、播放器兼容性任何一个环节出问题画面就出不来。尤其是摄像头分布在多个城市、多个运营商网络的时候端口映射和NAT穿透能把你逼疯。萤石开放平台做的事情是把“设备接入视频云”这件事变成标准化的服务。摄像头本身通过P2P或者平台转发的方式连接到萤石云云端的流媒体集群负责拉流、转码、分发你作为开发者不需要关心设备在哪个网络、有没有公网IP也不用自己搭建高可用的流媒体集群。你需要做的只是通过接口拿一个播放地址或者直接集成官方SDK把画面渲染到自己页面上。这就像你原来打算自己开一个快递中转站每个网点派车来送货你再分拣、再派送现在人家把整套物流网络建好了你只管到网点取件就行。省掉的不只是开发工作量更重要的是省掉了运维流媒体服务器和保障稳定性的长期成本。1.2 产品能力全景不是只有“看直播”这么简单很多人一提萤石开放平台音视频第一反应就是“摄像头直播”。实际它的能力覆盖了音视频应用的大部分场景我从产品角度拆一下能力模块说明典型使用场景实时视频预览通过API获取RTMP/HLS/FLV播放地址或SDK直接拉流渲染门店巡店、园区监控大屏、看家护院云端录像回放设备录像自动存到云端按时间轴调取播放事后查证、对账、稽核语音对讲支持App/Web与现场设备双向语音门店喊话、仓储远程指挥事件与告警设备检测到移动侦测、人脸、区域入侵时平台订阅事件推送给业务方AI巡检、客流统计、安防联动云存储套餐按天/按月购买存储周期录像不依赖本地SD卡无人值守场景、多店集中管理设备管理绑定、解绑、通道查询、能力集查询设备资产化管理这些能力通过两类接口暴露一类是云端OpenAPI走HTTP请求适合服务端调用另一类是端侧SDK提供iOS/Android/Web/WinForm等版本适合深度集成。大多数项目是两种混用——服务端拿地址播放器渲染对讲和低延迟场景则必须上SDK。1.3 它帮你解决的核心痛点我梳理了一下实际项目里的几个痛点萤石这套产品对应的解法是这样的不自己维护流媒体集群视频流从设备到播放器的中间环节全部在云端完成你不需要半夜起来处理流媒体服务崩溃的问题。跨网络也能看P2P穿透和服务器中继结合设备在哪个运营商网络都能拉得出画面弱网环境下比直连稳定得多。多端灵活的播放方案一套API拿到的地址Web端用FLV/HLS播放移动端用SDK或ijkplayer播放小程序也有对应的方案不用为每个端重新造轮子。对外集成友好权限体系、Token机制、接口文档都很标准适合作为业务系统的“视频底座”。所以从产品定位上说它不像通用云服务商那样只给你一堆IaaS能力让你自己拼而是直接把“音视频监控应用”最常见的需求封装成产品。你接的不是一台摄像头的裸流而是一整套“设备存储分发事件”的闭环能力。2. 接入前必须搞懂的四个概念2.1 AppKey、AppSecret与accessToken的关系萤石开放平台沿用了很标准的API体系你在控制台创建应用后会拿到一对AppKey和AppSecret相当于你应用的账号和密码。调用任何OpenAPI之前需要先拿AppKey和AppSecret去换取一个accessToken后续所有接口都带着这个Token请求。accessToken说白了就是你进出系统的大门的“临时门禁卡”。这张门禁卡有效期通常是7天到期后需要重新获取。实际开发中我建议把它放在服务端Redis里缓存起来设置一个比到期时间略早的过期时间比如第6天就主动刷新一次这样前端拿到的Token永远是有效的也避免每次请求都去重新换取导致接口被限流。这里有个特别容易踩的坑accessToken是跟着你的“应用”走的不是跟着设备走的。同一个AppKey下换取到的Token可以访问这个应用绑定过的所有设备和通道。如果项目里有多个独立的业务方建议分开创建应用各自用各自的Key数据权限才划得清。2.2 设备的serial和validateCode到底哪个是哪个接入一台设备时服务端需要两个关键参数deviceSerial设备序列号和validateCode设备验证码。序列号在设备机身贴纸、包装盒上都有验证码一般也是在贴纸附带或者通过设备本地界面查看。我在教同事接入的时候经常说一句序列号是设备的身份证验证码是设备的接入密码。注册新设备时这两个必须对上否则平台会拒绝绑定。但要注意这个验证码不是萤石云App的登录密码也不是WiFi密码。很多新手第一次接入把App账号密码填进去结果反复报错。正确做法是去设备管理后台或者包装盒上找“安全码/验证码”那一栏。还有一类特殊情况如果设备已经绑在别人比如客户自己的萤石云账号下你想通过开放平台去访问设备需要先在App里把设备解绑或者通过开放平台的“设备转移”流程把设备归属权划到你的账号下。这部分权限问题最容易在项目交付阶段出乱子务必提前和客户确认清楚。2.3 通道号与主码流/子码流多目摄像头、NVR网络硬盘录像机这类设备一个设备序列号下面可能挂载多个通道。比如一个双摄球机通道1拍全景、通道2抓特写接了一台16路NVR那一个设备底下就是16个通道。调API的时候channelNo这个参数就是用来指定通道的默认通常从1开始。码流方面绝大多数摄像头同时输出两路视频主码流高清码流和子码流标清码流。主码流分辨率高、码率大适合大屏回放和事后分析子码流分辨率低、带宽占用小适合多路同时预览。业务系统里常规做法是九宫格、十六宫格这种多画面视图统一用子码流拉单画面点开放大时再切主码流。这样带宽压力会小很多加载速度也更快。2.4 两条接入路线OpenAPI和端侧SDK怎么选萤石开放平台的音视频接入主要分成两条路线我建议项目一开始就把路线定下来不然后期返工成本很高。OpenAPI路线服务端调用接口获取播放地址然后前端用通用播放器flv.js、HLS.js、原生video等去播放。优点是非常轻量接口文档清晰不依赖特定SDK适合快速出demo、Web端集成、服务端拉流。缺点是语音对讲、云台控制这类交互性强、延迟要求高的功能纯Web实现起来比较吃力播放的时延也会受协议影响。端侧SDK路线直接在App或Web里集成官方SDKSDK内部完成设备发现、P2P建连、画面渲染、对讲全流程。优点是可玩的东西多延迟低支持私有加密传输摄像头能力调得深缺点是SDK体积大集成工作需要配文档慢慢趟而且售后排查的时候很多问题会定位在SDK内部需要对比日志和版本。拿我自己做的连锁门店项目来说第一版就用的OpenAPI后端每分钟巡检一次所有门店的在线状态前端需要哪一路的画面时请求后端地址然后flv.js去拉FLV流播放上线非常顺利。后来客户要求总部能主动对门店喊话实时性和音频推流复杂度上来了才针对“对讲”这个单独能力集成了移动端SDK。把两条路混用反而比一开始就押注某一条路更稳。3. 从OpenAPI到第一路画面完整跑一遍3.1 获取accessToken的实际请求换Token的接口很常规请求格式大体如下具体字段名以控制台文档为准但思路一样POST https://open.ys7.com/api/lapp/token/get Content-Type: application/x-www-form-urlencoded appKey你的AppKeyappSecret你的AppSecret正常情况下返回的数据里会带一个accessToken字段还有过期时间expireTime。我习惯把Token和过期时间一起存Redisdef get_token(app_key, app_secret): redis_key ys7:access_token:{}.format(app_key) cached redis.get(redis_key) if cached: return cached resp requests.post( https://open.ys7.com/api/lapp/token/get, data{appKey: app_key, appSecret: app_secret}, timeout5, ) data resp.json()[data] # 提前1天过期保证前端永远用有效token redis.set(redis_key, data[accessToken], exdata[expireTime] - 86400) return data[accessToken]这个小技巧我吃了不少亏才总结出来。Token要是在播放过程中突然过期所有正在播的画面会直接断掉下一次请求才拿到新Token再重连。对广告屏、值班室大屏这种不会有人盯着刷新的场景来说凌晨黑屏真的会让运维想骂人。3.2 拿到直播地址但怎么选协议获取直播地址的接口大概长这样POST https://open.ys7.com/api/lapp/live/address/get Content-Type: application/x-www-form-urlencoded accessTokenxxxdeviceSerialxxxchannelNo1quality1protocol2quality一般是 1高清主码流和 2流畅子码流的区别protocol参数可以指定返回的流类型通常能拿到RTMP、HLS、FLV三种地址。这里不要看到地址就直接用你得看播放场景RTMP延迟低大概1到3秒但浏览器原生不支持需要在Flash已淘汰或特定播放器里才能播现在主要用于服务端转推流。HLS兼容性最好iOS原生、Android原生、桌面浏览器的video标签基本都能播但有10到30秒的延迟不适合做实时对讲适合慢直播、事件回放。HTTP-FLV延迟在2到5秒配合flv.js在Chrome/Firefox里能播是Web端实时预览最合适的方案但移动端浏览器的兼容性要自己做降级。所以我在架构里通常这样定Web端优先拿FLV地址移动端优先拿HLS地址服务端转推流的时候才用RTMP。这套组合在各类项目里实测下来最稳定。3.3 播放端接入的三种常见写法拿Web端举例最省事的是用flv.js播放HTTP-FLVimport flvjs from flv.js; const videoElement document.getElementById(video); const flvPlayer flvjs.createPlayer({ type: flv, url: https://你的FLV直播地址, isLive: true, }); flvPlayer.attachMediaElement(videoElement); flvPlayer.load(); flvPlayer.play();播放HLS的话PC端可以用hls.js做法类似把type改成m3u8。移动端如果不做套壳App直接用video标签播HLS地址就行video srchttps://你的HLS直播地址 controls autoplay muted playsinline/video注意iOS上autoplay必须配合playsinline否则会被系统拦截不信你试试就知道了。Android端各家内核策略不完全一致也要做兼容测试。如果你们做的是AppAndroid可以集成ijkplayeriOS用VLCKit或者直接用自家SDK。编码方面萤石视频一般是H.264、音频是AAC通用性很好基本不会碰到解码器不支持的问题。3.4 云端录像回放不只是拿个地址那么简单回放的坑比直播更多。获取云录像地址的接口一般需要传设备序列号、通道号、开始时间、结束时间这几个参数。有个细节凡是涉及时间的参数平台统一要求UTC时间。国内开发习惯用北京时间请求前要做一次时区转换不然你查到的录像永远“差8小时”。拿到回放地址后大部分情况是一个m3u8文件链接播放器直接播即可。但注意回放地址同样有有效期而且受云存储套餐状态影响——客户的充值到期了你的页面再稳也调不出画面这个状态要提前做接口检测并提示用户续费。另外回放接口对时间范围一般有限制比如单次查询不能超过24小时或更短。要做一个“按天切换”的时间轴得设计成多次分段请求再拼接不能指望一次查整周。3.5 语音对讲最容易被低估的模块语音对讲在我经历过的项目里是开发量最大、坑最多的一块没有之一。硬件上你要处理麦克风权限、音频采集编码、回声消除网络上要解决音频推流、信令交互、实时性保障。萤石开放平台的对讲能力是通过SDK开放的Web端做对讲时会涉及音频采集和上行推流这个用纯OpenAPI很难达到理想的体验。我的建议是如果客户需求只是“听到声音、看到人”先确认场景是否必须双向对讲。单向“听”相对简单双向实时喊话对带宽、设备拾音器质量、网络上传速度都很敏感。设计方案时就要明确“对讲是轻聊级别还是硬实时级别”这决定了你需不需要额外投入设备端音频优化。4. 生产环境里经常遇到的坑帮你们提前避一避4.1 地址拉取到了画面就是黑屏这种问题排在所有接入问题第一位。排查思路按顺序来先看设备是否在线离线状态下地址都拿得到但播放就是黑的再看验证码填得对不对错了的话绑定那步就会失败最后看码流是否正常有些设备侧有人手动把子码流关掉了你传quality2肯定拿不到画面。4.2 播放卡顿、延时越来越大直播画面卡顿时十有八九是带宽问题但“带宽不够”不代表“升带宽就能解决”。要分清是上行带宽不足还是下行带宽不足。设备端上行带宽不够你服务器再大也没用这时候要考虑把码流切换到子码流播放端下行带宽不够要考虑CDN分发。另一种情况是播放器缓冲策略问题很多播放器默认把缓冲做得很大以保证稳定但这会让延迟越拉越大。直播场景里把缓冲调到最小档反而更实时。4.3 跨域问题、HTTPS混合内容问题Web端接入时如果你们系统是HTTPS的而播放地址是HTTP浏览器会直接拦截混合内容画面加载不出来。解决思路有两种一是看平台是否提供同域的HTTPS播放地址二是用Nginx在服务端代理流地址把HTTP流变成HTTPS流再转发给前端。能上代理就上代理别指望用户豁免安全策略。另外前端播放器在请求带鉴权的云端地址时可能因为请求头里带了自定义Header而触发跨域预检请求导致取流失败。排查方式是打开F12看Network面板确认是否有CORS错误。4.4 错误码与排查方向速查现象大概率原因排查动作请求返回“Token无效”accessToken过期重新换Token确认服务端缓存逻辑返回“权限不足”应用未开通对应能力控制台里确认是否开通视频预览/回放权限设备一直在“离线”状态设备网络差或已断电登录设备官方App确认设备真实在线状态绑定设备时提示验证码错误序列号/验证码不匹配核对设备贴纸或查设备本身的安全码播放一段时间后自动断开Token过期或播放地址失效提前刷新Token刷新播放地址回放查不到录像云存储未开通或时间选错检查存储套餐状态确认UTC时间这张表只能覆盖高频问题。碰到少见的错误码我的经验是直接复制错误码去搜官方文档或者看返回里的msg字段很多提示已经写得非常直白了先别急着猜测。4.5 关于安全合规的几点提醒接入视频能力会涉及真实场景的画面有几条红线我从第一个项目起就一直在遵守访问控制必须做在服务端不要让别人拿到一个地址就能随意播放直播地址和Token要设置合理有效期不要长期暴露摄像头放在公共区域或涉及他人隐私场景的要提前确认授权范围确保符合使用规范。技术能解决“能不能看到”但“该不该看”是设计和交付时就要想清楚的问题。5. 行业场景怎么落地三个方向的实战启发5.1 连锁门店与园区远程巡店这是萤石开放平台音视频最典型的应用方向。总部管理人员不可能一个个登录App看每家店更合理的方案是做一个Web巡店后台左侧门店树右侧多宫格实时画面点开任何一路都能秒切主码流放大巡店记录、异常事件自动关联到门店工单。回放能力的价值在发生客诉、财务对账时特别大直接按时间点把画面调出来比翻本地录像SD卡效率高一个量级。5.2 慢直播和品牌视频号的数据来源景区、农场、养殖场想做24小时慢直播或者把现场画面投到商业广场的大屏上直接拿索引设备的画面做主题直播靠平台流地址配合转推流服务投递到目标直播平台省去自己采购编码器和布线的成本。这里我建议选用HLS作为发布流协议播放端兼容性强转发链路上不容易出兼容性问题。慢直播场景对实时性要求不高稳定性和可观看时长反而更重要。5.3 AI音视频结合从“看得见”到“看得懂”“AI音视频”是这两年很热的方向。萤石平台在设备端已经做了不少结构化能力人形侦测、车辆识别、区域入侵、人脸抓拍这些事件可以通过订阅接口推送到业务侧。我在一个工厂园区项目里做了一套告警联动摄像头上报了“人员闯入”事件消息推送到服务端之后再转发到企业微信群值班人员直接点链接就能看到事发画面和录像片段。整个链路等于把音视频从“被动查看”升级成了“主动响应”这也是我觉得未来最有扩展空间的地方。5.4 多产品线组合让视频能力成为业务系统的一个模块把视力开放平台的音视频能力放进你自己的业务系统里它就不再是一个“监控工具”而是变成了业务闭环的一部分。比如在智慧零售里视频客流统计与POS数据打通得出进店转化率在物流园区里车辆出入的视频联动地磅系统形成完整记录。这要求开发者在产品设计上把视频能力当作“基础设施”而不是孤立功能。接口越标准二次开发越顺畅这类组合玩法就越值钱。写在最后的一点经验我把萤石开放平台音视频这套产品用了将近两年最大的体会是无论OpenAPI还是SDK它们能帮你省掉80%的底层搭建工作但剩下20%的业务适配依然需要你自己想清楚。我建议第一次接的朋友别一上来就铺开做全功能先拿一路设备跑通“Token获取—地址拉取—Web播放”这个最小闭环确认延迟、画质、稳定性都能接受再考虑对讲、云存、事件订阅这些进阶模块。项目时间紧的时候尤其要克制你真正需要解决的问题往往是“让客户在一个页面里方便地看到画面”而不是“把视频底层全部重写一遍”。最后送一个小技巧接入后在控制台把应用的权限点一遍确认哪些能力已开通、哪些还要申请。很多人开发到一半发现对讲地址拿不到回头一看是权限没开白折腾了两天。先把基础配置弄干净后面的路会顺很多。
返回列表