尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

海康威视Linux二次开发全攻略:环境准备、取流、录像与国标接入

海康威视Linux二次开发全攻略:环境准备、取流、录像与国标接入 简介面向Linux平台C/C开发者提供一套海康威视网络摄像机SDK二次开发的完整工程样例涵盖设备连接、视频流获取、录像回放、报警订阅、PTZ控制等常见功能的调用思路可帮助开发者绕开官方云服务构建安全低延迟的本地视频应用。压缩包内共52个文件包含24个so动态库、10个h头文件、5个cpp源文件以及ui界面、makefile、pro工程文件等整体包体仅10.97MB结构清晰便于直接对照工程配置进行移植或改造。已有4921人学习下载受到较多Linux下安防开发者的关注。通过该工程可以快速理解HikCamera示例的初始化流程、Qt界面与SDK事件回调的衔接方式以及多线程视频渲染的基本写法对需要基于海康设备做定制化桌面应用的开发人员来说是一份可直接落地的参考案例。 说实话海康威视的SDK在Windows下很好上手文档全、Demo多遇到问题还能拿4200客户端做对照。但换到Linux下做二次开发情况完全不一样库文件十几个依赖关系不透明编译能过运行时却动不动段错误。我最早给客户的Linux服务器接海康设备时光把官方Demo跑出画面就折腾了大半天后面做取流、录像存储、国标平台对接又踩了不少新坑。这篇就把我在海康威视Linux二次开发这条路上实际验证过的完整路径写出来从环境准备、登录取流、录像检索到国标接入和版本兼容给准备在Linux服务器上接入海康设备的开发者做个参考。1. 拿到Linux SDK后先别急写代码环境跑通才是第一关1.1 SDK目录里最该先看的是版本说明解压官方Linux SDK后目录结构一般是include、lib、demo有的叫sample外加一份ReadMe或者版本说明。很多人习惯直接翻include头文件找接口我建议反过来先把版本说明看一遍。这套SDK对应哪个发布版本、支持哪些架构、有没有已知限制版本说明里都写得很清楚。我在一个项目里拿着旧版SDK写新功能编译报错报得莫名其妙后来换到新版SDK才通过问题就出在接口签名有变化。lib目录里网络摄像机相关的核心控制库是libhcnetsdk.so外围还有libHCCore.so以及部分第三方依赖库。这里有个提醒不要图省事把整个lib目录都拷进自己工程按需引用避免不同产品线的SDK互相污染。demo目录里的示例代码也别嫌弃虽然写得粗糙但接口调用顺序、结构体初始化方式都是对的照着改比海量翻文档高效。1.2 动态库加载失败用ldd把依赖链一次看透Linux下跑海康程序最常见的问题就是启动时报libhcnetsdk.so找不到或者某个依赖库版本不对。本质是so的搜索路径没有配对。不要直接把so拷到/usr/lib里跟系统库混在一起很容易出事。正确做法是在启动脚本里设置LD_LIBRARY_PATH再用ldd检查依赖链是否完整export LD_LIBRARY_PATH/your/path/HCNetSDK/lib:$LD_LIBRARY_PATH ldd ./your_binaryldd结果里如果有依赖项显示not found就按缺失项逐一补齐。我遇到比较多的两类情况一类是SDK带32位库机器是64位系统缺少32位兼容库导致加载失败另一类是libcrypto这类加密库版本冲突系统自带一份海康SDK也自带一份最终加载到哪一份取决于LD_LIBRARY_PATH的优先级。遇到这类问题先跑ldd再查环境变量基本都能快速定位别一上来就重编SDK。1.3 ARM板和交叉编译的额外坑很多项目不是标准的x86服务器而是ARM工控机或国产化开发板。这时候要用海康对应架构的SDK不能拿x86库直接交叉编译。我见过最典型的现场编译阶段全过运行阶段直接段错误查到最后是库架构选错了。另外交叉编译工具链的版本也得留意工具链自带glibc太老运行时会报GLIBC_XX符号找不到。这类问题在运行环境上打补丁很难受换工具链或者和厂商确认SDK架构支持情况更靠谱不要硬扛。2. 登录、取流、RTSP直拉三条必走的链路2.1 初始化与登录错误码比返回值更有用海康SDK的调用链路很固定先NET_DVR_Init初始化再NET_DVR_Login_V40登录拿到用户ID后执行后续业务结束前调用NET_DVR_Cleanup。登录参数里设备IP、端口默认8000、用户名、密码缺一不可。登录成功后会输出一个设备信息结构体里面包含了设备序列号、通道数量、设备类型很多业务判断都依赖这些字段。登录失败时很多新手只盯着返回值其实更该调NET_DVR_GetLastError()拿具体错误码。海康错误码表在SDK文档里有完整对照几个高频错误码建议背下来23代表密码类错误24代表权限不足超时和连接失败码在跨网段调试时也经常碰到。我之前在客户现场排查登录失败就是靠错误码缩小范围再结合网络连通性测试很快定位到是密码加密策略差异而不是SDK代码写错。2.2 实时取流别在回调里做耗时操作登录成功后调NET_DVR_RealPlay_V40发起实时预览传预览参数和一个回调函数。回调里收到的是复合数据流需要根据数据类型自己判断是视频裸流还是音频数据。拿到视频裸流以后是送解码器、做算法分析、还是直接落盘就看你自己的业务了。这个环节最大的坑是有人在回调里做图像缩放、磁盘写入、算法推理这些耗时操作。海康的回调线程由SDK内部管理回调阻塞时间太长轻则丢帧严重重则整路拉流假死还不容易复现。正确做法是回调里只做浅拷贝或入队把耗时处理丢给业务线程池。我后来在项目里统一封装了一个环形缓冲回调只负责写消费者线程负责处理拉流稳定性明显提升。2.3 RTSP地址拼接规则不依赖SDK也能拉流对接ffmpeg、VLC或者第三方算法平台时海康设备的RTSP地址比SDK链路更方便。主码流取流地址格式如下rtsp://用户名:密码设备IP:554/Streaming/Channels/101末位数字含义是固定的101是第一通道主码流102是第一通道子码流103是第一通道第三码流如果是第N个通道首位数字跟着变201就是第二通道主码流。摄像头挂在录像机后面时用录像机IP加对应通道号即可。调试时我在Linux下最常用ffplay验证ffplay rtsp://admin:xxx192.168.1.64:554/Streaming/Channels/101能在ffplay里正常出画面说明RTSP链路本身没问题再让业务程序接管排查范围一下子小了很多。3. 录像检索、下载与存储回放业务的核心细节3.1 录像文件查询与下载本地路径必须用绝对路径做视频平台类项目回放功能绕不开。海康SDK查询录像文件用的是“查找句柄”机制先按时间段发起查询拿到查找句柄再循环调取结果直到返回结束标志。每条结果包含文件开始时间、结束时间、大小和远程文件名。这段逻辑不复杂但很多人忽略了一点循环获取结果时没有判断“是否已查完”导致无限循环或者漏数据代码里一定要用返回码控制退出条件。下载录像时按时间下载和按文件名下载两种方式接口不同。按时间下载要传入起止时间和本地保存路径——这就是“下载录像存储位置在哪”的答案存在你代码里指定的本地路径不是SDK自己决定的。这里有三个容易忽略的点目录必须预先创建进程要有写权限磁盘空间要提前估算。曾经有个项目断电后下载一直失败查了半天才发现传的是相对路径工作目录一换文件就不知道写哪了改成绝对路径后正常。3.2 “录像机怎么识别硬盘”和“可用磁盘”的排查逻辑“海康录像机怎么识别硬盘”这个问题在二次开发里也绕不开。NVR侧硬盘不是插上就能录像的需要在存储管理中完成初始化硬盘变成私有格式后才开始写录像。如果你通过SDK或平台看不到录像、报存储异常多半是硬盘没初始化、状态降级、或者空间满了。SDK里有获取设备工作状态和存储状态的接口能区分无硬盘、硬盘错误、正在格式化、空间不足等场景。“可用磁盘”的报错我是在CVR集中存储设备上遇到的。这类设备会把多块硬盘组成存储池平台侧上报“不可用磁盘”时往往意味着某块盘被移除、损坏或者RAID状态异常。处理顺序一般是先看设备本身的硬盘状态再查存储池配置最后核对SDK上报的磁盘信息。不要一上来就怀疑SDK代码先确认存储链路的物理状态能省很多时间。3.3 新录像机接老摄像头兼容性在存储链路里的表现“海康新录像机能不能用老摄像头”这个问题的答案大部分情况下是可以但会有意外。老摄像头如果固件太旧可能只支持老协议或老旧编码格式接入新录像机后通道能发现但画面出不来或者录像文件播放异常。我之前遇到一个老摄像头接新NVR设备上显示的编码格式还是MJPEGSDK按H.264去解码出来的画面全是花屏。解决思路是先确认设备能力集和实际编码参数再决定是否升级摄像头固件不要一上来就拉着开发改代码。4. 国标GB28181接入多家厂牌汇聚时的标准路线4.1 SIP设备编码和通道编码平台不认你先自查这三项项目里设备不止海康一家时用国标GB28181接入比逐家对接私有SDK省事得多。国标接入时设备侧要配置SIP服务器ID、SIP服务器域、IP地址、SIP端口默认5060、设备ID和通道ID。SIP服务器ID和设备ID都是20位数字编码前8位是行政区域码中间位是设备类型码平台侧对编码格式通常有严格校验。我遇到最多的就是设备ID末尾几位填错平台一直显示设备离线抓包才发现SIP注册请求根本没被平台接受。通道编码同样要符合国标规则一个通道ID对应一路视频。有些平台还会要求配置视频编码类型、传输协议TCP/UDP、以及媒体端口范围。这些参数在平台侧和设备侧必须逐项对应差一个字符都可能注册失败。另外国标接入后视频传输通常走RTP/PS封装跟海康私有协议的裸流格式不一样如果做平台侧对接需要处理PS解封装这跟直接用SDK拿到的裸流编码格式是两条链路。理解这一点有助于分清问题出在协议层还是编码层。4.2 注册失败先抓包再改配置国标注册失败时最高效的排查手段不是反复改配置而是抓包。用tcpdump抓SIP 5060端口的数据包看设备有没有发出REGISTER请求平台有没有回401挑战设备有没有带认证信息重新注册。整个过程用Wireshark打开后一目了然tcpdump -i eth0 -s 0 port 5060 -w gb28181.cap抓包结果通常能直接看出问题落在哪一段设备没发REGISTER查设备侧SIP参数是否保存成功发了REGISTER但平台不回复查平台IP端口配置401之后认证一直失败查密码和摘要算法。这套链路我在多个项目里反复用基本能在半小时内定位问题比翻平台日志对着猜高效很多。有些现场不方便在平台侧抓包就在设备侧抓或者用Homer这类SIP跟踪工具但不管用哪种方式先确认REGISTER请求有没有走出去永远是第一步。5. 版本对应的坑多SDK共存与工具版本5.1 工业相机视觉SDK与固件版本为什么要严格对应海康除了网络摄像机还有工业相机产品线配套软件平台包括MVS和VisionMaster。做视觉项目的同学总问我工业相机和视觉软件的版本号要不要对应。我的答案很明确必须对应。工业相机的固件版本、SDK版本、软件平台版本三者强相关。相机固件升级后老版本MVS可能枚举不到设备MVS升级后老固件相机可能采图花屏、掉线甚至触发系统崩溃。更棘手的场景是同一台工控机上既跑监控设备的HCNetSDK又跑机器视觉SDK。两套SDK各自带加密库、日志库等第三方依赖加载顺序不对时会出现一个功能正常、另一个崩溃的怪现象。我的处理方式是把两套SDK放到独立子目录启动脚本里分别设置加载路径业务代码也拆成独立进程避免在同一个进程空间里互相干扰。5.2 4200老版本客户端与新版设备的兼容问题现场排查设备问题时很多人习惯用iVMS-4200客户端验证设备是否在线。但手里如果是老版本4200新版录像机或摄像头反而可能识别不到这不是设备故障而是老客户端对设备能力集支持不全。老版本4200配置新IPC的移动侦测、人脸抓拍等功能时界面可能直接置灰这是客户端能力落后于设备能力不代表设备不支持。我在项目里会把客户端版本、SDK版本、设备固件版本列为三件套任何一次升级后都重新核对一遍。这个习惯帮我减少了很多重复排查遇到“客户端看不到设备”的报错先升级到最新版4200再重新验证往往两分钟就确认了问题不在设备侧。最后说一个我自己的部署习惯。凡是跑海康SDK的Linux进程我都会在运维脚本里加上自动重启逻辑进程异常退出后自动拉起同时把退出码和NET_DVR_GetLastError()的错误码一起打印成一行日志。因为这类进程跟设备固件之间的兼容性问题往往是运行时才崩编译期根本发现不了。让进程先恢复起来再回头看日志定位是在客户现场保命的关键一步。如果让我给后来者一句话总结就是先把环境跑通再优化业务最后处理兼容性按这个顺序走海康Linux二次开发能少踩很多不必要的坑。本文还有配套的精品资源点击获取
返回列表