ARTICLE DETAIL

资讯详情

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

RV1106+SC3336低照度摄像头方案:ISP调优与H.265硬编码全流程

RV1106+SC3336低照度摄像头方案:ISP调优与H.265硬编码全流程 最近手头有个项目需要做低照度网络摄像头选型的时候在几颗芯片之间反复比过最后落在瑞芯微RV1106 思特威SC3336这套组合上。从硬件接线到SDK编译从ISP调优到H.265编码推流整个过程踩了不少坑也把关键参数一个个理明白了。这篇文章就按项目实际推进的顺序来写从第零步开始一直做到RTSP拉流把RV1106摄像头低光照优化和H.265硬编码的全流程拆开讲清楚给准备从零上手IPC/智能摄像头、尤其是想用SC3336这颗传感器的朋友一个可以直接照抄的参考。1. 方案选型与硬件基础1.1 为什么选RV1106 SC3336这套组合RV1106是瑞芯微面向IPC和智能视觉市场的一颗高性价比SoC集成了单核ARM Cortex-A7、0.5TOPS算力的NPU、自带ISP和H.264/H.265硬件编码器。这意味着你不必像树莓派方案那样外接USB摄像头或者转接板也不用为了编码视频额外挂一颗编码芯片。单颗SoC就能完成图像采集、ISP处理、AI分析、视频编码和网络传输整板功耗可以压到很低基本是给电池摄像头、太阳能摄像头、智能门铃这类产品量身定的。SC3336是思特威的一颗300万像素CMOS传感器常见输出分辨率是2304x1296支持MIPI CSI-2两线输出接口很简单。单论规格它并不是最出挑的但它在这类IPC SoC方案里是现货最充足、资料最全、社区验证最多的搭档之一。很多RV1106开发板的默认测试模组就是SC3336这意味着驱动、设备树、ISP参数都有现成参考不用自己从寄存器手册啃起对从零上手的人非常友好。低光照方面SC3336的量子效率和暗电流表现在这个价位算不错但真正决定夜视效果的是后端ISP的调优能力。RV1106自带ISP支持3D降噪、宽动态、局部对比度增强这些功能配合SC3336能做出在0.1lux左右还能看清轮廓的画面。这套组合的另一个好处是成本低整板物料成本比主流海思方案少一截更适合做小批量或成本敏感的产品。1.2 硬件接线和电源那些事SC3336通过MIPI CSI接口连接到RV1106本质上只有两组信号一组是MIPI数据/时钟另一组是I2C控制信号。实际操作中需要注意的引脚主要是RESET、PWDN和I2C地址。SC3336的I2C地址常见是0x30具体以模组规格书为准可以在板子上先用i2cdetect扫描确认。接线的时候有一个特别容易踩的坑sensor模组的IO电压通常是1.8V而RV1106的I2C引脚如果默认工作在3.3V直接连上去轻则通信不稳定重则烧坏传感器。我这里用的是带双向电平转换的模块把I2C的SDA/SCL都拉到1.8V域再用万用表确认一遍电平再上电。RESET和PWDN的控制时序也要留意。PWDN这个引脚如果悬空很多模组内部会默认拉高导致传感器一直处于掉电状态开机后I2C扫描不到设备或者能读到ID但图像全黑。我习惯在设备树里明确把PWDN和RESET都配置成GPIO并且在上电后先拉低、保持一段时间再拉高复位。电源这块容易被忽略。SC3336在低照度模式下由于自动增益和曝光时间都会变大sensor的瞬时电流会产生明显波动。如果供电纹波太差画面上会出现横向滚动条纹。我在VDD供电端加了一颗22uF陶瓷电容和一颗1uF小电容做去耦实测夜视画面干净很多。MIPI信号线尽量等长、少过孔走线不要跟电源线平行不然高帧率下容易有干扰。下面是我这版接线的实际对照表信号SC3336模组RV1106侧说明MIPI数据D0 / D1CSI2_DP0/DN0、CSI2_DP1/DN1注意差分对配对MIPI时钟CLK差分时钟与数据线走线区域分隔I2CSDA / SCL需要1.8V电平匹配建议加1k上拉电源AVDD / DVDD / DOVDD分别对应模拟、数字、IO供电按模组要求复位RESETGPIO控制低有效注意时序掉电控制PWDNGPIO控制低有效不能悬空2. 软件环境与基础系统搭建2.1 SDK获取与编译RV1106的官方SDK主要面向企业客户通过瑞芯微官方渠道获取网上一部分开源社区也有派生版本比如Luckfox这类针对开发板维护的SDK。我手里这块板子用的是Luckfox派生SDK底层仍然是Rockchip官方Buildroot和内核整体流程一样。拿到SDK之后建议在干净的Ubuntu 20.04环境里编译先装好交叉编译工具链和必要的依赖包。编译步骤按照SDK里的README走就行核心是选择板级配置、编译内核、编译rootfs、生成烧录镜像。以常见流程为例./build.sh lunch ./build.sh kernel ./build.sh rootfs ./build.sh update第一次编译需要拉取大量源码耗时比较长建议保持网络稳定。编译过程中最容易遇到的问题是主机缺少某个依赖包比如libssl-dev、u-boot-tools、device-tree-compiler之类按报错提示用apt装掉再重跑即可。另外一个经验是不要用root用户直接编译部分脚本在root下反而会出问题用普通用户加sudo授权更稳。2.2 设备树里SC3336节点怎么填才不踩坑设备树是整个摄像头初始化的关键SC3336有没有被正确识别、MIPI数据通道有没有配对全在这份dts里。启动时内核通过I2C访问传感器ID匹配上之后再把MIPI链路建立起来。如果设备树里某个属性对不上现象通常是I2C能扫描到地址但驱动报错说sensor ID不匹配或者media-ctl里看不到对应的subdev节点。我用的设备树片段大概是这样的具体GPIO编号要根据板子原理图改i2c2 { status okay; clock-frequency 100000; sc3336: sc333630 { compatible smartsens,sc3336; reg 0x30; reset-gpios gpio2 10 GPIO_ACTIVE_LOW; pwdn-gpios gpio2 11 GPIO_ACTIVE_LOW; rockchip,camera-module-index 0; rockchip,camera-module-facing back; rockchip,camera-module-name default; rockchip,camera-module-lens-name default; port { sc3336_out: endpoint { remote-endpoint csi2_dphy0_input; >media-ctl -d /dev/media0 -p正常情况下应该能看到类似这样的层次sc3336 2-0030作为subdev然后是rkisp0-isp、rkisp0-mpfbc之类节点最后是video节点。如果看不到sensor的subdev说明I2C通信或驱动匹配有问题回到设备树去查。如果能看到subdev但无法设置格式多半是MIPI通道配置不对。接下来把media pipeline设置成直接从sensor到ISPmedia-ctl -d /dev/media0 -r media-ctl -d /dev/media0 -l sc3336 2-0030:0-rkisp0-isp:0[1] media-ctl -d /dev/media0 -V sc3336 2-0030:0[fmt:SRGGB10_1X10/2304x1296]这里的格式名称和分辨率要以SC3336实际输出为准有的是SRGGB10有的是SG10具体看驱动的v4l2_subdev_pad_ops实现。设置完成后再用media-ctl -p确认格式已经生效。3.2 用v4l2-ctl抓帧验证画面链路通没通最直观的办法就是抓一帧原始图像看。用v4l2-ctl从/dev/video0抓NV12文件v4l2-ctl -d /dev/video0 --set-fmt-videowidth1920,height1080,pixelformatNV12 v4l2-ctl -d /dev/video0 --stream-mmap --stream-count1 --stream-tofirst_frame.rawNV12不是直接能看的格式需要转成RGB或者存成YUV文件。系统里如果有ffmpeg直接转换后看图ffmpeg -f rawvideo -pix_fmt nv12 -s 1920x1080 -i first_frame.raw first_frame.jpg打开图像正常画面应该细节清晰、颜色整体偏中性。如果画面发绿或者偏紫基本可以确定是原始Bayer排列配置错了SC3336输出的是某种固定排布但ISP里配置的Bayer pattern和实际不一致会导致颜色通道错乱。如果画面全黑优先检查镜头盖、曝光参数和IR-CUT位置。如果画面有严重的横条纹或花屏先看MIPI信号完整性再检查设备树里的data-lanes配置。这一步相当于整个方案的“冒烟测试”不通过的话后面调ISP和编码都是白搭。4. 低光照优化从默认参数到夜视效果4.1 理解ISP与RKAIQ在低照度下做了什么RV1106的ISP由瑞芯微的RKAIQ库控制AIQ把自动曝光、自动白平衡、自动聚焦、降噪、锐化这些算法打包成一套流程。应用层可以通过tuning工具在线修改参数参数最终保存成一份配准文件系统启动时加载。很多刚接触的人以为低照度优化就是拉高增益、加大曝光其实这两个动作只是最表层的东西真正影响画面质感的是增益策略、降噪强度、gamma曲线和黑电平这几个环节的联动。在默认参数下SC3336在光线充足时画面没什么问题但到了夜间如果AE策略只倾向于提高ISO/gain噪点会非常严重。RV1106 ISP里的3DNR三维降噪可以跨帧降噪对静态场景效果极好但运动物体会产生拖影所以强度不能无脑拉高。2DNR负责空间降噪对细节损伤比较大适合做辅助。低光照优化的本质是找到“曝光充分”和“噪声可接受”之间的平衡点。RKAIQ的在线调试方式很直接板子上跑起rkAIQ的serverPC端用tuning tool连接实时拖动参数看画面变化。如果你没有这套工具也可以直接改配准文件后重启应用。对于固定场景比如门铃、固定机位的安防枪机我更推荐先在线调好关键参数再固化到配准文件里不要指望全自动AE在所有光线下都表现完美。4.2 低光照参数调整实战从噪点到通透我在暗室测试时先把环境照度调到大约0.5lux然后按下面这组顺序调整参数效果最明显。AE目标亮度是第一步。默认目标亮度值可能设得偏高导致相机在暗光下拼命提增益和曝光来达到一个“白天般的亮度”结果噪声同时被放大。在0.5lux这种环境里把AE目标从默认的120/255降到80~100/255画面虽然看起来暗一些但信噪比明显提升。实测目标亮度在90左右时暗部细节和噪点的平衡最好。增益和曝光优先级也很关键。RKAIQ的AE策略一般支持“曝光优先”或“增益优先”两种模式。低照度下一定要设置为曝光优先先把曝光时间拉长到帧周期的极限再用增益补充欠曝的部分。比如在25fps下单帧最长曝光大约是40ms如果降到15fps最长曝光可以到66ms有些产品甚至会降到10fps把曝光拉到100ms。曝光时间优先的好处是长曝光不放大噪声只是运动物体会模糊而增益会直接把噪声放大倍数抬上去。3DNR强度在我手上的固件里默认在0.3左右低照度下我会调到0.5~0.6同时把2DNR控制在0.4以内保留一些纹理细节。如果场景里几乎是静态的比如楼梯间、仓库3DNR拉到0.7也没问题。Gamma曲线对着灰阶卡调不要让暗部一片死黑也不要让高光过曝。我最后常用的参数组合如下参数项白天值低照度夜间值说明AE目标亮度120/25585/255宁可画面暗一点保证信噪比最大模拟增益2x~4x8x~16x上限放宽但不能无限拉高最大曝光时间1/30s1/15s~1/5s配合帧率下调光照越差曝光越长3DNR强度0.2~0.30.5~0.6超过0.7后运动拖影明显2DNR强度0.20.3~0.4强了抹细节慎用Gamma曲线0.50.65提亮暗部但不要牺牲高光4.3 自动模式下的限制和自定义策略把参数固化之后还要解决“自动模式怎么办”的问题。实际项目中不可能所有场景都固定一组曝光和增益参数所以我通常会在RKAIQ的AE策略里做两个调整。第一把增益上限设到一个物理上合理的值不要让它无限制拉高比如SC3336到16x增益之后噪点已经不可控再往上已经没有意义。第二调整AE收敛速度低照度下收敛太快会导致画面亮度来回跳收敛太慢又会在开灯、关灯场景里迟迟不到位。如果传感器前加了红外LED还要处理IR-CUT切换和颜色问题。在低照度下切到黑白模式并用IR LED补光画面细节往往比强行彩色更好。因为彩色模式需要AWB在极度低照度下做色温判断很容易偏色。我的做法是检测到环境照度低于某个阈值后主动把IR-CUT切到夜视位、关闭AWB、把色彩饱和度降为零也就是直接切黑白模式。这样既省下了AWB的算力也避免了大量彩噪。5. H.265硬编码与推流全流程5.1 了解Rockchip MPP编码链路RV1106最大的价值之一就是自带H.265硬件编码器。在Mirror模式或普通IPC模式下视频数据流的路径是SC3336输出Bayer原始数据通过MIPI进入ISPISP输出NV12给编码器编码器输出H.265裸流再封装成PS/TS/MP4最后走RTSP推出去。这条链路上CPU不参与像素数据处理所以1080P30编码时CPU占用很低整机功耗也压得住。Rockchip的硬件编码接口叫MPP全称Media Process Platform。官方提供了命令行的测试工具比如mpi_enc_test适合快速验证编码器是否工作也有完整的API库供应用层调用。如果是自己写采集程序可以用V4L2从/dev/video0拿NV12帧然后调用MPP编码API生成H.265帧最后通过RTSP库推流。过程并不复杂但要注意帧率控制、码率控制模式、GOP大小的设定。5.2 用rkipc或GStreamer快速出流如果手头SDK里带了rkipc这是最省事的方式。rkipc把采集、ISP、编码、RTSP全部串好了只需要改配置文件。不同SDK路径不太一样常见的是在/oem/usr/share/rkipc/目录下有一个配置文件。我在这颗RV1106上修改的关键字段是video_typeh265 video_width1920 video_height1080 frame_rate25 bit_rate4096 rc_modevbr gop_len50把编码类型改成H.265码率控制在4Mbps左右VBR模式下场景变化小的码率更低CBR模式适合网络传输带宽比较稳定的场景。GOP长度设50帧相当于2秒一个I帧延迟和文件切片都比较友好。修改完后重启rkipc服务局域网内用VLC直接打开rtsp://板子IP/live/0能拉流就说明整条链路已经通了。如果你不想依赖rkipc用GStreamer也能完成同样的工作。RV1106的GStreamer插件里一般有mpph265enc底层调用的就是硬编码器。测试命令大概是gst-launch-1.0 v4l2src device/dev/video0 ! video/x-raw,formatNV12,width1920,height1080,framerate25/1 ! mpph265enc rate-controlvbr bitrate4096 ! h265parse ! rtph265pay config-interval1 ! udpsink host192.168.1.100 port5000这条命令是把H.265码流封装成RTP包发给PCPC端用ffplay或者VLC收流验证。config-interval1很关键它让RTP包周期携带SPS/PPS否则很多播放器无法解码。5.3 实测编码性能和延迟数据我在这套RV1106 SC3336配置下测过几组数据环境是1080P、25fps、VBR 4MbpsH.265编码结果大致如下项目实测结果备注CPU占用15%~20%单核A7硬编码器基本没给CPU增加多少负担内存占用100MB以内包含ISP、编码、RTSP缓冲编码延迟100ms左右不含网络传输纯编码引入的延迟端到端延迟300~500ms局域网RTSP拉流受播放器缓冲影响码率误差±10%VBR模式下静态场景实际码率更低这个性能对于轻量级IPC完全够用。如果做电池摄像头还可以把帧率降到15fps、码率降到2Mbps画面编码后每帧数据量更小传输和存储压力都小很多。需要注意的是SC3336最高分辨率2304x1296如果按300万分辨率做H.265编码码率需要适当提升到6Mbps左右否则细节会有明显糊感。6. 常见问题与排查技巧实录6.1 传感器读不到ID或I2C扫描不到地址这个问题在最初调试时最常遇到。先用示波器或万用表确认I2C的SDA/SCL上有没有上拉电阻SCL有没有时钟信号。然后检查PWDN引脚的电平状态很多模组PWDN默认拉高需要设备树主动拉低才能让sensor工作。另一个常见原因是I2C总线上有其他设备冲突比如同样挂在同一条总线的存储芯片或PMICSC3336的地址如果和其他设备重叠需要改sensor模组的地址引脚或者把设备挂到另一条I2C总线上。还可以把设备树里的clock-frequency从400kHz降到100kHz排除时序问题。6.2 画面全黑但采集链路和编码器都正常这种情况多半是曝光参数问题。检查IR-CUT是不是停在红外滤光片位置有些镜头模组默认在滤光片位可见光进不来白场下拍出来就是全黑。再检查AE的目标亮度和最大增益上限设置如果增益上限被压得太低、曝光时间又受帧率限制夜间全黑环境会出现“auto曝光算出来的画面亮度完全不够”的情况。还有一个隐藏坑sensor的PWDN引脚在驱动里被配置成高有效还是低有效搞反了会导致模组始终处于掉电状态但I2C依然能读到ID画面上表现为黑帧。6.3 画面偏色或者绿色通道异常如果画面整体偏绿Bayer pattern配置错误排在第一位。SC3336的驱动在设置MIPI格式时会指定一种Bayer排布但RKAIQ内部的Bayer order必须和它匹配。这种问题改一个参数就行不需要动硬件。偏紫通常是AWB没收敛或色温判断错误先确认灯源环境色温手动固定AWB测试。还有一种情况是宽动态模式开启时黑电平或者Gamma曲线不配套导致低光部分整体偏色这种需要认真重新校一遍黑电平和颜色矩阵。6.4 H.265编码后花屏或马赛克严重花屏优先看码率是否设置得太低。4Mbps在1080P静态场景下画面没什么问题但场景大幅度变化时会瞬间出现大量块状花屏。可以把控制模式从VBR改成CBR或者把码率从4M提到6~8M。其次是GOP长度如果I帧间隔太长网络丢包又严重直到下一个I帧之前画面都恢复不了。建议区间在25~60帧。还有一个容易被忽略的点编码前NV12图像行的对齐方式如果你自己写采集程序宽度不足64字节对齐会导致编码器掐边或产生花边。6.5 RTSP拉流延迟大怎么办延迟大最直接的原因是播放器缓冲。VLC默认缓冲有几百毫秒用ffplay可以加-fflags nobuffer -flags low_delay降低延迟。如果确认播放器已经最低延迟还是高再排查GOP和RTSP的TCP/UDP传输方式。UDP传输比TCP延迟低但丢包会明显RTSP推流端在局域网内优先用RTP over UDP。还需要注意不要开软件编码、不要开过重的后处理缩放让编码器直接吃ISP输出的分辨率减少中间帧拷贝。6.6 V4L2采集报错或设置格式失败v4l2-ctl --set-fmt-video报错先确认分辨率是不是在sensor和ISP的能力范围内。SC3336常用分辨率是2304x1296、1920x1080、1280x720设置其他奇怪的尺寸有可能会被底层拒绝。另一个常见原因是格式字符串不对ISP输出一般叫NV12但有的SDK里叫NV12_8L128因为RK平台为了内存对齐做了特殊布局。用v4l2-ctl --list-formats-ext -d /dev/video0先把设备支持的格式拉出来按设备上报的格式名去做别盲写。6.7 设备树改完启动挂死或启动后DDR压力大设备树配置错误引起的内核panic一般集中在GPIO冲突上比如把已经被其他驱动占用的GPIO配置成了sensor的reset。调试时先用gpioinfo确认GPIO状态保证pin脚没有被复用过。另外SC3336如果配置成超大分辨率输出比如超出ISP处理能力ISP模块可能初始化失败导致挂死我这里试过把MIPI数据通道改成4lane但物理只接了两lane固件直接崩掉。这类问题基本从dmesg启动日志里就能找到关键字定位后再反推设备树。整套流程做到最后RV1106 SC3336这套方案已经能稳定出1080P H.265的夜间画面。我个人在这轮项目里感受最深的一点是低光照优化绝对不是某个单一参数的功劳而是曝光策略、降噪强度、gamma曲线和编码码率四件事一起协同的结果。每次调参最好只动一个变量观察画面变化后再动下一个否则出了问题根本不知道是哪个参数导致的。如果你也准备做类似项目建议先把采集链路跑通、抓出一张颜色正常的白天图像再谈低光照和编码否则会陷入“到处都改了但问题还在”的泥潭。后面有精力的话还可以在这个底板上叠加人形检测、移动侦测、时间戳和GIS信息OSD叠加这些功能这套基础链路已经足够了。
返回列表