1. 项目背景与方案选型思路
1.1 为什么最终选了HI3516CV610这个平台
做智能安防摄像头,第一件事往往不是画原理图、写代码,而是先回答一个问题:用哪颗主控。市面上的方案多得让人眼花缭乱,从海思、瑞芯微、君正到联咏,各家都有自己的一亩三分地,参数单上也都是“支持多少万像素、多少TOPS算力、几路码流”,真正到打包产品的时候,要考虑的远比参数单复杂得多。
我这次选HI3516CV610,主要看中三点。第一,它的定位非常清晰——就是给轻量型智能IPC用的SoC。安防行业里大概七成以上的产品,其实跑的都是人形检测、区域入侵、移动侦测、人脸抓拍这类的轻量AI,并不需要去跑大模型。CV610这个档位刚好卡在这个需求上,不会像用旗舰芯片那样“小马拉大车”造成成本浪费,也不会像纯功能机芯片那样做不了智能功能。第二,海思的SDK体系在安防领域的成熟度确实没得说,底层BSP、ISP、视频编解码链路基本是“开箱即用”的状态,对开发团队来说,省出来的都是真金白银的研发周期。第三,这颗芯片在编解码和功耗上的平衡做得不错,H.265编码能在保证画质的同时把码率压下来,2T算力虽然不高,但在0.5TOPS左右规格里做单路智能分析,国内已经有大量量产项目验证过稳定性。
顺带提一句,经常会有人拿它和RK3588这类旗舰平台比较。我的看法是,这俩压根不是一个赛道的东西——RK3588S适合做NVR、AI BOX这类需要同时跑多路视频流、重算法模型的高算力设备,而HI3516CV610做的是单路摄像头的轻量AI场景。选型最忌讳“一步到位”的思维,够用、好用、成本合适,三者同时满足才是关键。
1.2 整体方案框架与功能规划
在动手之前,我把整个系统的功能模块拆了一遍。这步看起来像个形式主义,实际做下来能省掉后面大量的返工。
这套智能安防摄像头方案,我规划成五层结构:视频采集层、编解码与流媒体层、AI分析层、业务管理层、设备接入层。视频采集层负责sensor图像数据的接入,这一层的关键在ISP调试,决定画质下限;编解码与流媒体层把采集到的原始图像做H.265编码,输出RTSP流供本地预览和云端拉流;AI分析层跑人形和移动侦测两类模型,这是“智能”二字的底气;业务管理层处理报警联动、OSD叠加、云台控制这类应用逻辑;设备接入层对接ONVIF和私有云协议,解决“这个摄像头怎么被别人家的NVR发现”这种兼容性问题。
从功能版本规划上说,我建议按“三步走”推进。第一版只要求跑通视频流和基本配置,做到插上网线就能在VLC里看到画面;第二版加入ONVIF协议和报警联动;第三版再上AI检测和云端接入。很多人拿到SDK第一反应是先把AI跑起来,结果视频流还不稳定就开始调模型,最后遇到问题完全分不清是链路问题还是算法问题,排查起来非常痛苦。硬件上,核心板加sensor模组加外壳的结构也决定了调试顺序——先裸板点屏,再装壳调散热,最后才做整机老化测试。
2. 硬件设计关键点
2.1 核心板与外围电路设计
HI3516CV610的硬件设计,说难不难,说简单也有一堆细节。核心板部分,DDR和Flash选型是重中之重。这颗芯片通常搭配DDR3或DDR4,容量16bit到32bit都有,具体看跑什么分辨率的实时预览和AI模型加载。我这次用的是512MB DDR3,实测跑2路1080P编码加单路智能分析,内存余量还有富余。Flash方面,对于只跑Linux系统加轻量算法库的场景,128MB SPI Nand已经够用,但如果你要把AI模型、Web端资源、字体库全部打包进根文件系统,建议直接上256MB,省得后面为了几百KB的剩余空间拆东墙补西墙。
电源设计是整个硬件部分最容易“翻车”的点。HI3516CV610的功耗虽然不高,但它对电源的时序有严格要求,多个供电轨之间必须有正确的上下电顺序,否则芯片工作不稳定,甚至出现“时好时坏”这种让人崩溃的故障。我建议在电路设计阶段就严格参照SDK里提供的参考原理图,AVDD、DVDD、IOVDD各路的滤波电容不要省,DC-DC的电感选型也尽量按参考设计来。隔壁团队就有过因为贪便宜换了一颗低频特性的电感,导致画面上出现周期性横纹,查了整整两天才发现是电源纹波串进了sensor供电。
另外,复位电路和时钟电路这两个看似不起眼的模块也值得单独说。复位芯片的延时时间要够,尤其当系统里同时存在Sensor、PHY、主SoC等多个需要复位的器件时,要保证主控先稳定再释放外设复位。晶振尽量选有源晶振,虽然贵几毛钱,但起振稳定性和温漂表现比无源晶振好不少——安防摄像头要在室外经历高低温,晶振一旦在低温下起振困难,整个设备就会“死机”,问题还特别难复现。
2.2 sensor选型、镜头与红外补光的搭配
主控定完之后,最影响画质的其实是sensor和镜头这套光学部件。HI3516CV610可以配的sensor选择面比较大,常见的有SC3336、GC2053、IMX335这几颗,都是主流的1080P到400万像素级别CMOS。我自己这次用的是GC2053,200万像素,背照式,弱光表现不错。选sensor不能只盯着分辨率和高灵敏度,还要确认三件事:是否在海思SDK的官方适配列表里、是否有对应的IQ调试文件、厂商能否提供足够的技术支持。买一颗“很厉害”但没有官方适配资料的sensor,光IQ调试就能耗尽你一个月的耐心。
镜头的选择跟sensor的靶面尺寸是强绑定的。GC2053是1/2.7英寸的靶面,配的镜头规格一般是3.6mm或4mm焦距、F1.8光圈。如果你做的是室内固定视角摄像头,4mm镜头就够了;如果是室外看院子或车库,建议上2.8mm广角,减少监控盲区。光圈越大,单位时间的进光量越大,夜视效果越好,但同时景深会变浅,近距离物体容易虚焦。这个取舍没有标准答案,关键看你产品的目标场景。
红外补光的设计也直接影响夜视效果。常见的方案是IR LED加光敏电阻,白天红外灯关闭、ICR切到红外截止滤镜,晚上红外灯打开、ICR切换到全透滤镜。这里有两个调试细节要注意。第一,IR LED的数量和角度要能覆盖镜头的视场角,不然画面中间亮四周黑,客户一看就觉得是次品;第二,光敏电阻的触发阈值要在实际场景里反复调,既不能傍晚就提前开灯导致画面偏色,也不能太暗了才开灯造成一段“黑白盲区”。我在调这个阈值的时候会找一个黄昏的时段,蹲在室外一遍一遍地调参数,直到画面切换的瞬间眼睛几乎看不出来才算过。
3. 软件开发环境搭建
3.1 SDK目录结构与交叉编译环境
海思的SDK解压之后,目录结构非常典型,初次接触的人可能会被一堆子目录整得有点懵。我这里按自己实际使用的心得,把最关键的部分梳理一下。SDK根目录下,osdrv这一层负责内核、uboot、rootfs的编译,是烧录文件的产出地;mpp这层是多媒体处理平台,包含VENC、VPSS、VI、AI这些核心模块的库文件和头文件;smp目录一般是应用层示例代码,很多团队直接从这里的sample改起。
搭建交叉编译环境是老生常谈的话题,但每次都会有新人在这一步卡住。HI3516CV610用的是arm-ca32架构,SDK里通常自带交叉编译工具链的压缩包,解压后把bin目录加进PATH即可。命令行下顺手写一个环境变量导出脚本,把PATH、CROSS_COMPILE、SDK_ROOT都设置好,每次开发前source一下,能省下大量敲命令的时间。需要注意的一点是,宿主机系统推荐用Ubuntu 18.04或20.04的64位版本,太新的系统有时会碰到依赖库不兼容的问题,比如32位libc库缺失,编译uboot报错,网上搜到的解决方案又五花八门,折腾半天还是换系统最快。
3.2 系统烧录与启动流程
系统编译出来之后的烧录工作,看着简单,但每年都会有人在里面“翻船”。海思方案通常用HiTool工具通过网口或串口烧录。网口烧录的速度快很多,建议优先用。接线方式很简单,电脑网口直连开发板网口,把电脑的IP设成和HiTool默认网段一致,板子在uboot状态下敲几行命令进入烧录模式,HiTool那头选好对应烧录项和文件路径,点击烧录即可。
第一次烧录的新人最容易犯的错,是把“烧录loader”和“烧录整个系统”搞混。如果只是更新内核或根文件系统,只需要在对应分区单独烧录,没必要每次都全量擦除重烧。全量烧录会覆盖掉你之前配置好的sensor参数和MAC地址,尤其是MAC地址,如果固件没有在首次启动时自动生成的话,全量烧完网络私网内可能就冲突了。正确做法是:开发阶段保留一份自己整理好的“分区烧录说明”,哪次改了什么模块就烧哪个分区,稳定运行之后再做一次全量备份,存成一个Golden Image,后续批量生产直接烧这个镜像就行。
启动环节同样值得耐心调一遍。接上串口线,设置好波特率(海思平台一般是115200),上电后能看到bootrom、uboot、kernel的启动日志逐步打印。启动过程中要重点确认三件事:DDR初始化是否通过、sensor的i2c地址是否正常枚举、网络PHY是否link up。这三项在日志里都有明确标识,一旦发现异常,优先查硬件连接和配置match的dts设备树节点。
4. 应用层开发与AI算法
4.1 视频采集、编码与RTSP推流
当系统能正常启动、串口控制台可用之后,第一步开发任务就是把视频流跑起来。海思的MPP(Media Process Platform)开发模型很清晰,整个链路是VI(视频输入)→VPSS(视频处理子系统)→VENC(视频编码)→RTSP打包上网。VI从sensor拿到RAW图,VPSS做缩放、裁剪、降噪这些图像处理,VENC把处理后的帧编成H.264或H.265码流,最后应用层把编码帧打包成RTP包,通过RTSP协议发出去。
MPP的初始化顺序是有讲究的。先初始化VB(Video Buffer)池,这是整个视频链路的“物流仓库”,所有模块的帧数据都从这块内存池里分配;然后配置VI通道绑定sensor;接着创建VPSS组和通道;最后才创建VENC通道。很多第一次接触MPP开发的人,代码写着写着就卡在“通道绑定失败”或“获取不到帧”这种报错上,十有八九是内存池设置太小,或者VI→VPSS的绑定关系没理清楚。我的习惯是先跑通SDK里的sample_venc,确认整个链路没问题,再一步步改成自己的逻辑。
RTSP推流建议用开源库实现。代码量不大,但要注意点是在推流之前先做SPS/PPS和关键帧的缓存,这样客户端一请求,立刻就能给出完整的参数集和解码起始帧,否则VLC这类播放器打开流时会黑屏很久甚至直接超时。我自己踩过这个坑,当时调试客户端始终连不上,抓包才发现服务器迟迟没收到DESCRIBE请求的响应,就是因为事件循环被编码线程阻塞了——把RTSP服务和编码放到不同线程后,问题迎刃而解。
4.2 人形检测与移动侦测的工程化落地
HI3516CV610的AI算力不大,但跑轻量级人形检测模型是够用的。海思SDK里会附带NNIE(神经网络推理引擎)相关的库和工具链,把Caffe或ONNX模型转换成海思的wk格式,然后在板端通过MPP的AI模块加载和执行。整个流程看似简单,实际执行中坑不少。
模型转换阶段最容易出的问题是算子不支持。设计网络结构时就要有“不变量”意识:优先用卷积、池化、全连接、Relu这类NNIE原生支持好的算子,像一些复杂的注意力机制模块,转换时经常会报错或精度下降。我的经验是先在PC上用样本集跑通训练,量化感知训练做扎实,让模型的参数分布尽量均匀,这样转换成wk后精度衰减才能控制在可接受范围内。
跑AI推理的线程需要注意和编码线程的优先级关系。NNIE推理是异步的,提交任务后需要轮询结果。如果轮询线程的优先级和VENC编码线程冲突,会出现编码卡顿或检测帧率低的奇怪现象。我最后的做法是把推理线程优先级调低,让它利用空闲时间片段跑,同时给结果增加“防抖”处理——连续N帧检测到人形才触发报警,连续M帧检测不到才解除报警,这样能有效过滤误报,避免画面里树叶飘动就触发一堆垃圾告警。移动侦测那边比较“朴素”,本质是灰度帧差分加阈值判定,在VPSS通道里开一个低分辨率的YUV输出,算法模块按时做帧差计算即可。
4.3 报警联动与业务逻辑封装
AI检测到结果之后,摄像头不能只在串口里打印一行日志就算完事。实际产品里需要设计一连串的联动动作:抓拍一张当时的JPEG图片保存到本地、在视频流OSD上叠加检测框、通过HTTP或MQTT把报警消息推送到云平台、发送GPIO信号打开一个声光报警器。这一串业务逻辑建议封装成一个独立模块,向上提供统一的“报警事件”接口,向下对接各类执行器。这样以后设计新功能时,不需要改动底层的检测代码,只需在事件回调里增加新的动作就行。
OSD叠加这里有一个特别容易忽视的问题:字库资源。在OSD上显示中文报警信息,比如“检测到人形”,需要把字库文件拷到根文件系统对应的路径下,并且字库编码要和要显示的文字保持一致,否则画面上就是一串乱码。我吃过这个亏,当时赶进度把字库文件漏掉了,客户演示时报警信息显示成方块,场面要多尴尬有多尴尬。
5. 常见问题与排查技巧实录
5.1 设备启动失败类问题
做嵌入式开发,串口日志就是医生的“CT片”。设备上电后完全没有打印,第一步检查电源,用万用表测各路电源轨是否正常,重点看核心电压有没有拉低短路的情况。电源正常但还是没有任何打印,就查晶振是否起振,用示波器看主晶振引脚的波形。这两个地方都没问题时,再考虑烧录进去的uboot是否和DDR配置匹配——DDR颗粒型号不同,初始化参数也不同,uboot里的DDR training参数不正确的话,启动就会卡住或者反复重启。
我遇到过最隐蔽的一个问题是:设备上电后串口偶尔有打印,偶尔没打印,看起来完全随机。查了很久才发现是一颗电源芯片的EN引脚接到了GPIO复位信号上,复位信号有一个微小毛刺,偶尔会误触发电源芯片的关断,导致系统刚初始化一半就断电重启了。最后在GPIO输出上串了一个RC滤波电阻电容组合,问题彻底消失。这种电源毛刺类问题,如果不花时间抓波形,靠肉眼盯串口日志是很难定位的。
5.2 网络通信异常类问题
摄像头做好了,插上网线却ping不通,这类问题在项目开发中占比很高。先用串口进系统,ifconfig看网口IP是否设置正确,再ethtool eth0查看PHY有没有协商上千兆或者百兆。网络不通大概率不是软件问题,而是硬件链路问题,用万用表量网口变压器耦合端的差分线对地电阻是否正常。很多硬件工程师在设计时把网口TX和RX差分线接反了,这种情况只能改板,没有别的办法。
软件层面的网络问题,重点关注RTSP流的端口防火墙配置。物联网设备经常会被部署到各种复杂的网络环境里,需要确保554、80这些常用端口没有被限制。还有一个经验是,部分NVR或客户端对RTSP URL的路径有严格规范,比如有些只认rtsp://ip/stream1这种形式,如果你用了自定义路径,需要对照设备ONVIF文档做调整。实测下来,尽早安装ONVIF测试工具做互操作性验证,能省下后面大量的联调时间。
5.3 画质与AI检测不稳定问题清单
画质问题涉及的变量非常多,这里整理一个我常用的排查顺序表:
| 现象 | 优先排查项 | 关键验证手段 |
|---|---|---|
| 画面全黑 | sensor上电时序 / I2C配置 | 串口查看VI通道是否报“no signal” |
| 画面偏绿或偏红 | ISP白平衡增益异常 | 抓RAW图用海思工具分析R/G/B通道数值 |
| 画面有横纹 | 电源纹波干扰 / sensor帧率与光源频率不匹配 | 示波器测电源纹波、调整曝光行数 |
| 晚上画面噪点多 | IR LED驱动电流不足 / sensor增益过高 | 调整IR LED亮度或降低ISO增益 |
| AI漏检率高 | 检测ROI范围设置不合理 / 模型量化精度损失 | 在不同距离和角度测试,重新标注训练 |
AI检测不稳定的问题,有一半以上其实不是算法的问题,而是输入到模型的图像质量不稳定。VPSS输出的检测通道如果分辨率太低,远处的人形只有几十个像素大小,模型再强也识别不了。项目设计早期就要算清楚这个账:检测通道的分辨率还是要结合视场角和检测距离来定,比如GC2053在4mm镜头下,5米远的人形大概占画面高度的六分之一左右,能把这个人形区域映射到算法输入尺寸的30像素以上,检测效果才比较可靠。
6. 产品化落地与整机测试
6.1 web管理与本地配置页面
智能安防摄像头不能只靠串口配置,尤其当设备交付给最终用户的时候,必须有一个简单易用的配置页面。我在项目中采用了轻量级Httpd加CGI的方案,页面放在根文件系统里,用户通过浏览器访问设备IP就能打开配置界面。页面功能至少包含,视频预览、网络参数设置、报警联动开关、云存储配置入口等。
Web预览有个技术要点需要提前规划——前端播放RTSP流并不被主流浏览器直接支持,所以通常的做法是后端把RTSP转成HLS或WebRTC流,或者用MJPEG做低延迟预览。HI3516CV610的编码能力足够同时出一路MJPEG主码流用于Web预览,这种方式在局域网内延迟可以控制在几百毫秒内,体验还不错。如果要做公网访问的HLS流,需要在应用层把编码好的视频切片成m3u8和ts文件序列,这一块代码量不小,但好在方案成熟,照着开源实现改造即可。
配置页面的安全性也别忽视。默认密码、权限控制、防暴力破解,这几点在项目验收时经常被重点检查。最简单的做法是内置一个一次性初始化密码,用户在首次登录时必须修改,这样既保证了安全,也省去了在说明书里印一大串复杂初始密码的麻烦。
6.2 高低温与老化测试
嵌入式设备在实验室里跑得好好的,到了用户现场就出问题,这在安防产品上太常见了。问题的关键往往在高低温适应性和长时间运行的稳定性。我在这套CV610方案上做的高低温测试,温度范围大概是-20℃到60℃。低温测试容易出现的问题是设备启动慢甚至起不来,LVDS或MIPI信号因温度变化导致时序偏移,sensor不出图。高温测试容易碰到的问题是整机散热不良导致sensor温度过高,画面出现大量热噪点。
老化测试建议跑至少72小时。测试期间要监控三个指标,内存占用是否持续增长、CPU占用率是否异常波动、视频流是否长时间不中断。内存泄漏在嵌入式系统里非常隐蔽,往往要跑一周甚至更久才能暴露出来。我在老化脚本里加了一个简单的计数器,每5分钟重启一次RTSP拉流,模拟用户频繁打开预览的行为,很多偶发的内存泄漏就是这样暴露出来的。
6.3 批量烧录与生产注意事项
产品定型后进入批量生产阶段,烧录效率就成了影响交付周期的关键因素。我采用的是工厂产线烧录方案:先用一台电脑搭建本地HTTP服务器,把固件镜像统一放在服务器上,产线工位只需要把设备接入局域网、进入烧录模式,用一条脚本自动完成镜像下载和全量烧录,单台设备的烧录时间能控制在两分钟左右。相比一台一台插着读卡器拷贝,速度快了不止一个量级。
批量生产还有一个容易踩的坑是“每一台设备的MAC地址都相同”。如果固件里写死了MAC地址,同一局域网内多台设备一定会冲突。解决思路是在uboot或首次启动脚本里实现一个MAC地址生成策略,比如根据sensor板上预烧的ID号或者某个EEPROM区域的信息做hash,生成一个唯一的MAC。总之,批量烧录流程一定要包含“唯一化”处理这一步,否则售后团队会天天接到“设备掉线”的投诉。
最后再分享两点个人体会
这套HI3516CV610方案的开发过程,最让我感慨的一点是:做智能硬件,真正难的不是某一项单一技术,而是把硬件、底层系统、应用算法、产品体验这几条线拧成一股绳。经常看到一个团队硬件很强,软件也能跑,但到了联调环节两拨人互相“打架”,原因就是前期的需求和责任边界没理清。所以我的习惯是,项目一开始就把功能模块图贴到墙上,每一个模块标记清楚负责人和接口定义,谁出了问题一目了然。
另外一点经验是,方案选型时一定要留出至少20%的性能余量。芯片算力、内存容量、网络带宽,看着够用,实际跑起来算法模型更新、客户加需求、码率调高,每一个变化都在吞噬这些余量。CV610这颗芯片,如果刚开始就把算力用到90%以上,后期稍微加一个语音识别模块就会非常吃力。留有余量,产品才有迭代的空间。
希望能给正在做或者准备做智能安防摄像头的朋友一些参考。这行当没有太多捷径,踏踏实实把每一步走稳,产品自然会替你说话。