ARTICLE DETAIL

资讯详情

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

Web端集成海康监控:RTSP转流、WebRTC播放与选型实战

Web端集成海康监控:RTSP转流、WebRTC播放与选型实战 做了几年监控平台隔三差五就有人问“浏览器里怎么调海康的摄像头画面”。问到后来我都条件反射了先问内网还是公网再问要几路并发最后问是不是必须用官方控件。这三句话基本决定了一套方案的走向。Web端集成海康视频监控画面说穿了就是要把设备能力搬进浏览器。可浏览器这个环境天生不友好RTSP协议不支持、ActiveX插件早被淘汰、H.264/265解码还得看硬件脸色。所以市面上能走通的路就那么几条选错了就是加班修bug选对了就是两杯咖啡的事。这篇文章我把自己实操过的方案、踩过的坑、排查顺序都写出来给正在做Web监控集成的朋友当个参考。1. 先看全貌Web端接海康监控的3条路线1.1 三条路线怎么选做选型之前先花十分钟把你的需求列清楚访问端是PC还是手机、是内网还是公网部署、同时看几路画面、延迟要求多高、有没有回放和云台控制需求。这几项定下来路线基本就锁定了。目前主流的方案就三类方案实现原理适用场景优点缺点海康官方Web控件本地安装代理服务通过WebSocket与页面通信本地解码渲染内网PC端、单路或几路预览集成快、画质还原度高不支持手机端、并发受限、浏览器新版本兼容麻烦自建流媒体网关服务端拉RTSP转成HLS/HTTP-FLV/WebRTC输出公网或内网、多路并发、跨终端浏览器免插件、扩展性强、可做权限控制需要运维流媒体服务有一定部署成本云平台接入设备通过国标GB28181或私有协议上云调用云端API播放多站点远程统一管理免自建服务、手机PC都能看有流量费用、延迟稍高、视频出园区我自己的项目经验如果是给一个工厂做内网监控看板官方Web控件最快如果是给连锁门店做远程巡店平台直接上流媒体网关如果是设备在外地需要集中管理优先考虑走GB28181接国标平台或者厂家云平台。硬要用一套方案套所有场景后面必被坑。1.2 为什么不能直接播RTSP流早年间浏览器还能通过ActiveX、NPAPI插件播RTSP比如海康老版web3.0控件。后来Chrome 45彻底砍掉了NPAPIEdge也不再支持ActiveX这条路就断了。Google做过统计插件是浏览器崩溃和安全隐患的主要来源所以各家浏览器厂商铁了心要把插件清零。这就导致了一个尴尬局面设备端的RTSP流明明好好地在那里放着浏览器却“看不见”。想解决只有两条路一条是装一个本地代理程序绕过浏览器去拉RTSP流再用WebSocket把画面传给页面另一条是在服务端做协议转换把RTSP转成浏览器原生支持的HLS、HTTP-FLV或WebRTC流。所以以后再有人问“为什么我不能直接在浏览器里打开rtsp://”别解释复杂的协议原理就说一句“浏览器不认这个协议”就够了。真正要思考的是选哪条路来“翻译”。1.3 一套能落地的参考架构我目前在项目中用得最多、踩坑最少的是“设备端RTSP 自建流媒体网关 WebSocket/HTTP播放”这套组合。整体长这样海康摄像头/录像机 → RTSP拉流 → ZLMediaKit流媒体服务 → WebRTC/HTTP-FLV/HLS → 浏览器播放对海康设备来说RTSP地址是现成的关键是服务端要有一个稳定高效的流媒体网关。这个网关既负责拉流、转封装、分发也顺便把底层协议差异屏蔽掉了。前端只需要拿到一个http或者webrtc开头的URL丢给播放器就行。这套架构还有一个隐藏好处以后如果要把其他品牌的摄像头大华、宇视、天地伟业接进来只要它们支持RTSP或者ONVIF同一个网关就能统一接入不用再给每个品牌单独写播放器适配逻辑。2. 路线A实操自建流媒体网关把RTSP转成WebRTC2.1 流媒体服务部署以ZLMediaKit为例开源流媒体服务器里我用过SRS、MediaMTX、ZLMediaKit三款。做海康接入我推荐ZLMediaKit原因很实在开箱即用、单二进制部署、对WebRTC支持成熟、HLS/HTTP-FLV/RTSP/RTMP一站式输出而且国内社区活跃文档也是中文的遇到问题搜起来不费劲。如果机器上有Docker部署就一条命令的事docker run -id --name zlm \ -p 1935:1935 -p 8080:8080 -p 8554:554 -p 10000:10000 \ -v /opt/zlm/data:/opt/media/conf \ zlmediakit/zlmediakit:master端口用途解释一下8554是RTSP服务端口1935是RTMP端口8080是HTTP-FLV和HLS端口10000是WebRTC端口。如果你打算用HTTPS对外提供服务还需要再加一个SSL端口并配置证书。建议把这些端口统一记到运维文档里后面排查网络问题要用。2.2 海康RTSP地址拼接与验证海康设备的RTSP地址格式网上有很多版本最容易记的就是这两条主码流rtsp://用户名:密码IP:554/Streaming/Channels/101 子码流rtsp://用户名:密码IP:554/Streaming/Channels/102解释一下101和102代表什么第一位数字“1”表示通道1如果是多通道录像机第二位通道就是201、301后两位“01”表示主码流“02”表示子码流。所以通道1的主码流是101通道2的子码流是202以此类推。NVR和单摄像头用法一样替换成NVR的IP和录像机的账号密码即可。拼接完别急着写代码先用ffprobe验一下地址通不通ffprobe -rtsp_transport tcp -i rtsp://admin:密码192.168.1.64:554/Streaming/Channels/101 -show_streams -v error能正常打印出视频流信息说明地址和账号都没问题。如果ffprobe卡住或者报401 Unauthorized大概率是密码错误或设备开启了防暴力破解等一会儿再试。2.3 海康摄像头怎么接入流媒体服务ZLMediaKit有主动拉流代理功能可以在后台配置让它主动去拉摄像头的RTSP。但我实践下来用ffmpeg手动拉流再推给ZLMediaKit的场景更多因为在批量接入时脚本化控制的自由度更高。拉流推流命令ffmpeg -rtsp_transport tcp -i rtsp://admin:密码192.168.1.64:554/Streaming/Channels/101 \ -c:v copy -c:a aac -f flv rtmp://127.0.0.1:1935/live/camera01这里有几个关键点一是必须加-rtsp_transport tcp用UDP拉流在跨网段时经常花屏、卡顿TCP稳定得多二是视频流直接-c:v copy不给CPU增加编解码负担三是推流地址live/camera01中的camera01就是你后面播放时用的流ID建议命名和摄像头编号对应。多路摄像头接入时可以写个脚本循环启动ffmpeg再加个supervisor或者systemd守护进程进程挂了自动重启。路数多了以后建议直接用ZLM的拉流代理配置省去维护一堆ffmpeg进程的麻烦。2.4 前端播放低延迟WebRTC与兼容兜底前端播放是我踩坑最深的环节。先说结论要低延迟1秒选WebRTC适合云台控制、实时喊话这类互动场景要兼容性最好选HLS几乎所有浏览器都能播但延迟5~10秒要低延迟高兼容折中选HTTP-FLV延迟1~3秒但需要flv.js这类库如果项目面向的是PC端后台我建议直接用WASM解码播放器比如jessibuca。它能直接解码H.264裸流不需要浏览器原生支持H.265内网部署几百路也不吃力播放示例const player new Jessibuca({ container: document.getElementById(player), videoBuffer: 0.2, isResize: true, decoder: /decoder.js, // wasm解码器路径 useWCS: false }); player.play(webrtc://192.168.1.100:10000/live/camera01);延迟对比看一下协议延迟浏览器兼容适合场景WebRTC0.2~1秒Chrome/Edge/Firefox/Safari新版云台控制、实时指挥HTTP-FLV1~3秒需支持MSEPC端监控大屏HLS5~15秒全兼容iOS自带支持移动端、公网直播如果一个页面同时预览十几路切记不要每路都开一个WebRTC连接会瞬间打满浏览器并发限制。我一般会把预览路数控制在4~9路超过就提示用户按需点开或者做成分页轮播。3. 路线B实操海康官方Web控件能装还得能看3.1 官方Web控件到底在做什么海康官方Web控件也就是web components或者老一点的web3.0控件本质上是个本地代理。它不是一个单纯的JavaScript库而是伪装成浏览器插件/本地服务的客户端程序。你安装控件之后本机会多一个后台服务页面通过WebSocket连到这个服务由它去拉RTSP流并解码再把图像数据发给页面渲染。这个套路的优点是实现简单、不需要自己搭流媒体服务器单机看几路画面效果很好。缺点是浏览器兼容性脆弱换台电脑、换个浏览器、升级个版本都可能导致控件失效。这也是网上“海康itcp web components安装后还是看不了视频”这个热搜问题常年挂在技术社区的原因——真不是个例。3.2 “安装后还是看不了视频”排查清单这个热搜词我太熟了几乎每个月都要帮人排查一遍。我把问题顺序整理成了清单照着查基本十分钟定位确认装的是“运行库”而不是“开发包”。很多同学从官网下载的是Web开发包里面只是示例代码和文档控件本体没装。检查后台服务有没有启动。Windows里按WinR输入services.msc找Hikvision Web Components Service或者类似名字确保状态是“正在运行”。杀毒软件经常把这个服务当风险进程杀掉。看WebSocket端口通不通。默认端口通常是18081之类的本地端口换成远程服务器访问时得确认防火墙放行了这个端口。页面是HTTPS、控件服务是HTTP浏览器会把混内容直接拦掉。这种情况要么给控件服务配证书要么让页面临时用HTTP访问。控件初始化代码有没有写对。官方示例里要指定playWindowId、playURL还有控件实例的名称搞混了画面当然出不来。建议先跑通官方demo再做二次开发。浏览器版本太新。新版Chrome/Edge对私有协议限制更多官方控件有时候需要切到兼容模式或者用特定版本的浏览器内核。如果你已经处于“公网访问、多用户、异地办公”这类场景那么官方控件确实不是长久之计。控件只能装在每一台需要看视频的电脑上运维成本极高这种时候老老实实走上章的自建网关方案更有前途。3.3 官方控件方案适合什么项目别误会我并不是说官方控件一无是处。如果你是给工厂车间做一台看3~5路画面的本地监控电脑网络环境封闭、终端固定官方控件仍然是最省事的选择——不需要流媒体服务器、不需要考虑公网带宽、画质还原度也是原汁原味。但如果你的项目里出现下面任何一个词建议直接放弃官方控件手机、跨网段、异地、多用户、直播、分享链接。出现一个就可以考虑上流媒体网关方案了。4. 进阶集成回放、云台、报警一件事都不能少4.1 录像回放先查录像再拉回放流监控平台只做实时预览是不够的用户总会接着问“能不能看回放”。海康设备查回放路径一般有两种第一种是ISAPI查询录像需要POST XML到设备POST /ISAPI/ContentMgmt/search Content-Type: application/xml请求体大致长这样CMSearchDescription searchID1/searchID trackList trackID101/trackID /trackList timeSpanList timeSpan startTime2025-01-20T10:00:00Z/startTime endTime2025-01-20T11:00:00Z/endTime /timeSpan /timeSpanList maxResults100/maxResults /CMSearchDescription注意这里的时间格式是UTC时间而且不带毫秒。查询结果里会返回录像文件列表和时间段拿到结果之后再按时间段拉回放流。第二种是直接用带时间参数的RTSP回放URLrtsp://admin:密码192.168.1.64:554/Streaming/tracks/101?starttime20250120T100000Zendtime20250120T110000Z这条地址同样要交给流媒体服务去拉前端播放逻辑和实时预览几乎一致只要切换播放地址就行。我踩过最大的坑就是时间格式设备端的时区是东八区但URL里要求UTC时间如果你只填了本地时间回放时间永远对不上画面永远黑屏。稳妥的做法是先写个小脚本测试两条记录点的URL再用真实数据验证。4.2 云台控制ISAPI接口一发就动球机和云台枪机的转动控制海康走的是ISAPI协议。核心就一个连续移动接口PUT /ISAPI/PTZCtrl/channels/1/continuous Content-Type: application/xml请求体控制云台转动方向和速度pan是水平速度tilt是垂直速度取值-1到10表示停PTZData pan0.8/pan tilt0/tilt zoom0/zoom /PTZData前端交互上注意一个细节不要在按钮点击时发一次请求就结束惯性会有迟滞感。我做云台控制时用的是“按下开始转动松开发停止指令”的模式停止指令就是把pan、tilt、zoom全部置0的同一接口。预置点调用是另一个接口PUT /ISAPI/PTZCtrl/channels/1/presets/1/go就一条PUT请求编号1到255之间。预置点的设置、删除、遍历也都有对应ISAPI接口可以直接在设备手册里查到。4.3 报警与事件让监控“主动说话”监控画面如果不能联动报警价值少了一半。海康设备报警事件上报最简单的做法是使用ISAPI的报警流订阅接口。设备端在事件发生时移动侦测、遮挡报警、信号丢失会推送事件通知。想实现Web端弹窗提醒比较典型的做法是后端订阅设备的报警流收到事件后通过WebSocket实时推给前端页面。这套链路的好处是报警可以和历史数据、工单系统打通形成完整的业务闭环。如果设备已经接入GB28181国标平台也可以走国标的事件上报平台侧统一处理报警分发。项目里有跨品牌设备或需要平台对接时GB28181的报警联动比逐台对接ISAPI省事很多。5. 排错清单看完这篇再也不用求人5.1 连接与拉流类问题现象可能原因排查方向FFmpeg一直卡在tcp connectIP/端口不通、防火墙拦截554ping设备IPtelnet IP 554报401 Unauthorized账号密码错、设备启用防暴力破解去设备后台确认用户权限拉流成功但画面花屏传输用了UDP导致丢包加-rtsp_transport tcp画面卡顿、延迟越来越大网络带宽不够或设备码流过大了换用子码流降低分辨率/码率ZLM拉流后无音频海康默认音频是G.711转封装时有兼容坑先不加音频-an跑通视频再加5.2 播放与解码类问题前端画面黑屏但控制台没报错这题考的是排查经验。最常见的两个原因一是H.265编码没有对应的解码器普通的flv.js播不了需要WASM解码库或者让服务端转码成H.264二是WebRTC端口没开播放器能建立连接但收不到媒体流。验证方法很简单换个播放器再看后端有没有对应流在输出。5.3 踩过几次坑之后沉淀的几个经验第一预览永远优先用子码流。主码流4K画质确实好但内网设备一多带宽和流媒体服务器的压力会指数级上升。实战中我的做法是网格预览全部走子码流单路放大支持手动切换主码流。用户体验好系统也稳得住。第二先把协议验证明白再写代码。很多同学一上来就开IDE写前端结果RTSP地址是错的折腾两三天还以为是代码问题。先用ffprobe、VLC、Postman把RTSP、ISAPI接口全部调通代码写起来会爽很多。第三设备安全是底线。海康设备接上公网以后第一件事就是修改默认密码、关闭不需要的端口映射、升级到最新固件。千万不要把RTSP明文地址直接暴露到公网一定要在流媒体网关层做鉴权否则你的摄像头就是别人眼中的“直播源”。5.4 并发访问与安全加固建议流媒体网关可以支撑几百路并发但那是机器性能攒出来的。我一般在架构上加一个Token校验层客户端先申请一个有时效的播放Token带Token才能拉流。这样既避免了地址裸奔也方便做权限控制、流量审计。摄像头侧则要注意设备同时拉流的会话数量限制低端摄像头往往只能支持两三个并发RTSP会话。比如同一个摄像头有人在萤石云上看你又去拉流很容易把设备挤掉线。稳妥的做法是统一经过流媒体网关解耦不要多个服务直接抢设备的并发通道。6. 一些实际体会回头来看Web端集成海康视频监控技术上并没有一劳永逸的银弹方案只有“在什么场景下选什么工具最合适”的权衡。个人经验小规模内网、终端可控的项目官方控件效率最高要上规模、要跨网络、要多终端自建流媒体网关是绝对的主流如果还要做智能分析、算法联动网关方案几乎是唯一选择因为它能把视频流以标准协议的形态交给上层业务系统。最后分享一个小技巧做这类集成一定要在项目早期跟设备供应商要一份“设备对接手册”或者“SDK二次开发指南”上面的接口列表、RTSP规则、ISAPI方法都是现成的比在网上零散搜答案高效得多。先把文档吃透再去折腾代码这条路我替你验证过很多次了。
返回列表