拓冰建站拓冰建站
首页 / 资讯中心 / 正文

RV1106+SC3336低光照优化与H.265编码实战指南

做IPC网络摄像头这几年瑞芯微RV1106是我经手过把性价比压到极致的一颗主控。它配合思特威SC3336传感器一套带低光照优化和H.265编码的1080P星光级方案BOM成本能压到很低在白牌摄像头、智能家居、智能车视觉模组里非常常见。这篇文章把我从零配置RV1106SC3336的完整流程整理出来重点放在低光照优化和H.265编码这两块——因为很多朋友在传感器驱动通了之后画质和编码这两个硬骨头才是真正决定成品体验的地方。无论你是刚拿到开发板的初学者还是遇到画质和带宽优化问题的一线工程师这套流程都能直接套用。1. 为什么是RV1106 SC3336方案选型前的思路拆解1.1 RV1106这颗芯片到底强在哪瑞芯微RV1106定位是AIoT视觉处理器它最让我满意的地方不是单核性能而是把IPC主控需要的外设和加速单元都集成好了。主控核心是Cortex-A7架构跑Linux系统做协议栈、Web服务、RTSP推流都够用自带0.5TOPS的NPU后面想做移动侦测、人形识别、区域入侵这些AI功能不用换主控就能直接跑ISP部分支持多帧合成和3A算法可以处理3帧HDR视频编解码单元支持H.265/H.264硬件编码这意味着CPU不用碰编码这件事。更重要的是RV1106有内置DDR的封装型号硬件设计省掉了外挂内存颗粒的麻烦对做小体积PCB非常友好。整个方案的典型功耗在1W上下一个普通散热片就能压住。这和树莓派、海思方案比起来RV1106在“成本、画质、AI能力、开发速度”四个维度上做到了一个不错的平衡点。如果你的项目预算在百元级、需要H.265编码、还要留AI升级空间这颗芯片是当前非常值得考虑的选项。1.2 SC3336传感器为什么配它是黄金搭档SC3336是思特威的一颗300万像素CMOS传感器常见出图规格是2304x12961/2.4英寸靶面像素尺寸比同级产品偏大低照度下收集光子的能力更强。加上MIPI CSI-2接口输出RAW Bayer数据给RV1106的ISP处理整套链路非常干净。选择SC3336作为搭配还有几个实际工程层面的原因。第一这颗sensor在瑞芯微官方SDK里已经有了现成驱动不需要从头写寄存器配置第二它支持双帧DOL HDR可以在逆光场景下做长短曝光融合第三SC3336的IR红外响应经过优化搭配850nm/940nm红外补光时黑白模式下的灵敏度不会掉太多。对低光照摄像头来说sensor本身的灵敏度决定了下限ISP和编码决定的是上限SC3336的基础素质能保证低照优化有得玩。在硬件连接上SC3336和RV1106之间就五组线MIPI的2对数据lane、1对时钟lane加上I2C控制、Reset复位、MCLK时钟。电源部分需要单独给sensor提供1.8V和2.8V模拟电源AVDD和DOVDD要干净否则画面上会出现横纹噪声。我建议在sensor供电引脚旁边加一个0欧电阻和一个10uF电容调试时方便断开量电流也能滤掉一部分电源纹波。2. 搭建开发环境与系统烧录先把SDK跑起来2.1 拿到SDK之后第一件事确认板级配置瑞芯微的IPC SDK通常是一整包Buildroot系统里面包含了kernel、rootfs、ISP算法库、rkmpp媒体库以及ipc demo程序。拿到SDK之后不要急着编译先去SDK根目录看device/rockchip/rv1106/下的板级文件。一般来说一个典型的IPC项目会对应一个BoardConfig文件比如BoardConfig-IPC-RV1106-256M之类里面指定了交叉编译器、rootfs类型以及内核defconfig。先做着三件准备工作确认sensor型号在kernel-5.10/arch/arm/boot/dts/rv1106-evb*.dts里有没有对应节点如果没有就找一个相近的SC3336 DTS复制一份改成自己的I2C地址和GPIO控制脚。确认编译工具链是否存在SDK内置的build.sh脚本通常会自动处理如果之前装过其他工具链建议用SDK自带的版本避免交叉编译时头文件版本对不上。确认rootfs的配置里有没有打开IPCServer或采集demo一般SDK默认包含了rkipc这个总控程序它负责采集、ISP、编码、推流和云台控制等任务。SDK里代码结构比较多我习惯先跑一遍默认编译看能不能出固件再做裁剪。上来就改代码容易让自己连环境问题还是代码问题都分不清。2.2 编译和烧录的完整流水线操作假设你已经进入了SDK根目录典型流程是./build.sh lunch # 选择板级配置找到带IPC关键字的选项 ./build.sh # 全量编译编译过程第一次会比较久主要是在构建Buildroot系统包。如果中途编译失败先看是不是网络下载问题国内环境经常卡在下载软件包上可以配置镜像源或者把下载好的.tar包放到dl/目录。编译完成后在output/out/目录下会生成升级固件通常包含update.img、boot.img、rootfs.img等。烧录工具用的是瑞芯微的RKDevTool操作上先让开发板进入MaskROM或Loader模式。按住板子上的恢复键上电后设备管理器会识别到一个ADB还是Loader设备不同板子不一样。然后把miniPCBA的烧录线插好RKDevTool里点“升级固件”选择生成的update.img点“升级”等待完成。烧录完成首次启动串口波特率通常是1500000bps如果SDK默认不一样就以源码里的说明为准。看到系统shell登录提示后我的习惯是先执行下面几条命令确认基础环境cat /proc/version # 确认内核版本 cat /proc/cmdline # 确认启动参数 cat /sys/class/video4linux/video*/name最后一条命令会列出当前系统注册的video节点能看到类似rkisp_mainpath或者sensor的名字。如果sensor驱动正常注册isp的video节点应该存在说明驱动层面的基础链路已经通了。3. SC3336摄像头驱动配置让MIPI链路先通起来3.1 设备树里的关键参数配置SC3336驱动注册不了或者video节点没出来十有八九是设备树DTS里sensor节点没有匹配上。RV1106的sensor节点一般挂到某个I2C总线上,你需要确认三件事I2C地址对不对、Reset和PowerDown引脚的GPIO编号对不对、MCLK频率是否匹配。SC3336默认I2C地址是0x307位地址但在不同硬件上也有可能被配置成0x32或者0x2C。驱动加载失败时可以通过I2C工具扫描确认i2cdetect -y 0如果扫描到了sensor地址但dmesg里显示探测失败多半是Reset引脚时序问题。SC3336的驱动通常需要在上电后保持Reset拉低一段时间再释放这个时间不能太短有些sensor需要至少10ms。如果这个时序在驱动里配置不对传感器芯片会一直处于复位状态I2C能扫到但读不出正确的ChipID探测就失败。DTS里另一个重点参数是MCLKRV1106给sensor提供的外部时钟一般配置24MHz。如果MCLK引脚没有输出sensor内部PLL没有参考时钟出不了图。可以用示波器量一下MCLK引脚没有波形的话去查时钟框架里有没有把clk_mipicsi_out的时钟树打开。3.2 用media-ctl和v4l2把链路串起来SC3336驱动加载成功之后sensor会作为一个subdev出现在media设备上但默认链路可能是断开的。RV1106的ISP采集链路通常是这样sensor subdev - mipi csi dphy - rkcif mipi subdev - rkcif mainpath video node。用media-ctl可以查看当前链路media-ctl -d /dev/media0 -p看到节点之后手动设置格式和链路media-ctl -d /dev/media0 -r media-ctl -d /dev/media0 -l SC3336:0-rkcif-mipi-lvds:0[1] media-ctl -d /dev/media0 -V SC3336:0[fmt:SRGGB10_1X10/2304x1296]格式要看SC3336输出的是10bit还是12bit RAW以及是哪一种Bayer排列RGGB还是BGGR这里不能照搬。设置完之后用v4l2抓一帧验证v4l2-ctl -d /dev/video0 --set-fmt-videowidth2304,height1296,pixelformatNV12 v4l2-ctl -d /dev/video0 --stream-mmap --stream-count1 --stream-totest.yuv很多第一次接触RK ISP链路的人容易忽略sensor原始输出是RAW格式但是最终video节点输出的可以是NV12或者NV21中间会经过ISP的处理。所以这里的pixelformat设置要和ISP的输出配置一致而不是和sensor的输出格式一致。能抓到NV12数据说明pipeline已经通了接下来才能谈画质优化。4. 低光照优化把SC3336的画质潜力榨出来4.1 ISP 3A baseline先校准AE和增益策略低光照优化不是简单地把亮度拉起来而是要在一个“噪声、拖影、偏色”的三角关系里找到平衡点。RV1106的ISP自带3A库调试时一般通过rkaiq或者rkipc的配置文件修改参数我记得在SDK里是rk_aiq相关的库。先看AE自动曝光策略。SC3336作为一颗主打低照度的sensor增益上限可以放得比较高但快门和增益的优先级要设置好。我的习惯是在光线充足时优先调节光圈和快门当环境照度下降时再逐步提高增益。曝光时间不能无限拉长否则运动物体会拖影监控场景一般把自动曝光最大快门限制在1/25s以内。如果极限低照下还是太暗可以考虑切换帧率把30fps降到15fps让每一帧的曝光时间更长。下面是我在一个低照度项目里实际用过的AE参数表不同驱动版本可能字段不同但核心思路通用环境照度增益策略快门范围帧率策略是否切黑白100lux以上1x-2x1/100s-1/500s保持30fps否10-100lux2x-6x1/50s-1/100s保持30fps否1-10lux6x-12x1/25s-1/50s可降到25fps临界切换0.1-1lux12x-24x1/15s-1/25s建议降到15fps是注意增益调太高之后噪点会非常明显所以NR降噪的强度必须跟着增益走否则画面就是“亮但是糊”。4.2 降噪和锐化的平衡调参的现场实测心得低光照画面最容易出现的两个问题一个是彩色噪点一个是涂抹感。RV1106的ISP链路里通常有2D NR和3D NR两级降噪模块。2D NR是单帧空间降噪对静态画面效果好但强度拉太高会把细节磨平像涂了一层油3D NR是多帧时域降噪利用前后帧信息来降噪对低照度动态场景帮助最大但运动物体容易出现拖影鬼影。我在实际调参时先把3D NR关掉只调2D NR观察天空、墙壁这类均匀区域还有没有人眼可见的亮度噪点然后把2D NR固定在中间档位再逐步加3D NR强度观察运动的行人会不会出现残影。如果残影明显说明时域降噪的强度超出了运动矢量的估计能力需要降低时域强度。另外锐化不要开太大。锐化在低照度下会把噪点一起锐化画面看起来颗粒感极重。有个技巧是“先降噪后锐化”并且锐化的阈值设置得高一点只有梯度明显的边缘才加强弱边缘和噪声区不要动。这样在低照度下才能保留文字的边缘同时背景不脏。保存一张白天和一张夜间的参考图来回切换看锐化效果这个动作我每次都要重复很多遍。4.3 黑夜模式切换彩色转黑白不是简单去色低光照优化的一个重要功能是“彩转黑”。很多人以为日夜切换就是把图像饱和度调成0实际上SC3336这类sensor在低照度下彩色信号的信噪比已经很低强行保持彩色只会放大噪点和偏色。正确的做法是通过IRCUT切换滤光片让sensor在黑白模式下接收全光谱光线配合红外补光灯来提升画面亮度。在RV1106平台上IRCUT通常由两个GPIO控制一个给IRCUT-A一个给IRCUT-B。切换动作是通过双电压翻转来移动滤光片位置代码里要保证两个GPIO的输出电平是互补关系并且在切换后留出几十毫秒的稳定时间等滤光片到位后再继续抓图否则画面上会出现半幅模糊半幅清晰的尴尬状态。什么时候切换有不同的策略。简单一点的看AE统计的lux值低于阈值就切黑白好一点的方案是把sensor当前的增益值当作切换依据。因为增益值直接反映了sensor对光线的需求比照度计更贴近实际。我一般把切换阈值设在AE增益超过10倍、并且持续2-3秒时才触发避免车灯闪过或者云遮挡导致的频繁切换。4.4 HDR与多帧合成逆光场景的救急手段SC3336支持DOL HDR数字重叠HDR它通过长短曝光两帧图像融合来扩展动态范围。在逆光场景比如人物站在窗口、车辆进出车库不做HDR就是背景过曝或人脸死黑开了HDR之后能同时保留亮部和暗部细节。但HDR也不是开了就好DOL HDR有个典型的运动鬼影问题。长曝光帧和短曝光帧之间有时间差物体一旦运动融合的图像边缘会出现透明状的重影。在RV1106的ISP配置里可以通过HDR融合的强度参数来控制长短帧的权重配比。我测试下来静态监控场景可以把融合阈值放低追求高动态范围如果有行人、车辆经常经过还是保留一点运动补偿的余量更好否则鬼影比动态范围不足更难看。还要提一个功耗和性能的取舍。HDR开启后ISP需要处理两帧数据带宽占用和功耗都会上升如果设备是电池供电这部分耗电不容忽视。我建议把HDR做成可配置项白天背光严重的场景打开夜间纯低照场景关掉靠NR和曝光增益来保证亮度和噪点水平。5. H.265编码落地把1080P画质压进窄带宽5.1 选H.265而不是H.264带宽和存储的账做摄像头的人都会在H.264和H.265之间纠结。H.265HEVC相比H.264在同画质下可以节省30%-50%的码率这对存储空间和上行带宽来说是实打实的节省。假设一个项目用H.264跑1080P码率大概是4Mbps一天录像约43GB换成H.265之后码率降到2~2.5Mbps一天录像能控制在25GB以内。对于MicroSD卡存储或者4G模块上行的方案这个差距会直接决定成本能不能接受。RV1106内置的VPU是硬件编码H.265这意味着CPU占用很低不会因为编码消耗掉太多主控资源。实测下来1080P30fps的H.265编码CPU占用率通常只有个位数百分点剩下的算力可以用来跑RTSP服务、算法检测和网络传输。这就是硬件编码和用CPU软编最大的差距。5.2 编码参数实战GOP、码率、帧率怎么配在RV1106的IPC SDK里编码参数一般通过rkipc的配置文件控制。以下是一份我常用的1080P H.265编码配置video_0: { enable: 1, width: 1920, height: 1080, frame_rate: 30, bit_rate: 2048, max_bit_rate: 2560, encode_type: h265, gop: 60, profile: main, rc_mode: avbr, smart_mode: 0 }逐个说说参数怎么选。GOP是I帧间隔我这里设成60也就是2秒一个I帧。I帧是解码基准帧码率比P帧大很多但靠I帧才能快速定位播放和丢包恢复。GOP太大会导致视频流中途丢包后花屏时间变长太小则会浪费码率。2秒一个I帧是监控场景的常用值播放端拖动进度条时能更快定位。rc_mode我用了AVBR自适应可变码率意思是允许码率在一定范围内浮动。固定码率CBR适合带宽受限的场景码率恒定但画质波动VBR是追求画质恒定但码率会突变容易超出窄带宽链路。AVBR折中两者在保证平均码率的前提下给复杂画面一定的突发空间实际这是我最常用的模式。帧率方面如果网络带宽比较紧张可以降到20fps甚至15fps但要注意播放端的流畅度以及低照度下帧率本来就可能自动下降。这时候需要确认编码器的帧率配置和AE策略是否联动不然会出现“sensor出15fps、编码器却按30fps配置”的错位问题。5.3 在RV1106上跑通RKMpp编码流程瑞芯微的媒体库叫RKMpp它提供了一套统一的编码API。SDK里通常已经有现成的编码demo如果你想自己写一个最小编码应用流程大致是这样先初始化RKMpp编码器设置输入帧格式为NV12、宽高为1920x1080然后把ISP输出的NV12帧数据送入编码器循环读取编码后的H.265裸流最后把裸流封装成MP4或者走RTSP推流。在命令行测试时用FFmpeg的rkmpp编码器是最快的验证方式。前提是编译FFmpeg时打开了--enable-rkmpp插件ffmpeg -f v4l2 -input_format nv12 -video_size 1920x1080 -i /dev/video0 \ -c:v hevc_rkmpp -b:v 2M -maxrate 2.5M -bufsize 4M -g 60 -r 30 \ -f rtsp rtsp://192.168.1.100/live/test如果只是先验证编码功能不推流直接输出成文件ffmpeg -f v4l2 -input_format nv12 -video_size 1920x1080 -i /dev/video0 \ -c:v hevc_rkmpp -b:v 2M -g 60 -r 30 -y test.hevc这里有个小坑使用rkmpp编码时输入格式必须是编码器支持的格式NV12是基本盘。如果你的sensor/ISP输出的是NV16或者RGB就得先转成NV12否则编码器会报参数错误。另外H.265裸流后缀用.h265或.hevc播放时用VLC或者FFplay都能解。6. 常见问题与坑位速查我的调试实录6.1 直接把踩过的坑整理成排查表调试过程中最容易卡住的问题我把现象、排查思路和解决办法整理成了一张表供大家直接对照参考。现象可能原因排查与解决I2C扫描不到SC3336sensor供电没上、Reset没释放、地址不对量AVDD/DOVDD电压确认RCU时序用i2cdetect扫描0x28-0x37范围抓图全黑但没有报错MCLK没有输出、快门过短、IR补光没开示波器量MCLK看AE统计值调节曝光参数检查红外灯板控制脚画面偏绿/偏紫白平衡没收敛、IRCUT没有切换确认AWB配置手动切换IRCUT光路再抓图对比低照下噪点像雪花增益太高、3D NR没开降低最大增益打开NR并调整强度检查视频流码率码率太低也会导致块状感H.265黑屏/花屏解码端分辨率不对、I帧间隔太长换VLC看信息缩短GOP确认SPS/PPS是否随I帧发送RTSP推流卡顿上行带宽不足、编码器码率超限降低码率或帧率换AVBR模式检查网口速率和丢包最容易被忽略的是IRCUT光路问题。摄像头自动切换成黑白模式后如果IRCUT没有动作光线透过滤光片后画面会严重偏色且很暗但这个现象很像是“低光性能差”。我建议调试低光优化前先手动确认IRCUT切换功能正常。6.2 几个能让你少加班的经验心得配置RV1106的时候我心里一直记着几个原则。第一先通链路再优化画质。sensor还没出正常图之前不要调ISP参数否则你根本不知道问题出在噪声还是链路第二编码和ISP分开调。低光照优化时可以先输出成NV12文件到本地看效果别边编码边调参编码本身的压缩损失会干扰画质判断第三做好参数的版本管理。每次修改配置文件之前先备份并且把对应的样张也存一份否则你很难判断到底是哪一版参数让画面变好的。另外一个很多人忽略的细节是sensor驱动和ISP库的诊断日志要打开低照度下可以看到AE计算出的lux值、增益值、快门值这些数据是判断场景照度的最可靠依据。光靠人眼判断画面亮度去调参很容易被显示器亮度和环境光干扰。如果你打算在RV1106上做电池供电的产品我再多提醒一句H.265编码会带来低码率优势但ISP的3D NR和HDR处理都很耗电建议做不同档位的夜间模式在“画质优先”和“续航优先”之间让用户自己选。这个功能加上去之后产品的竞争力会明显提升。这套流程走下来RV1106SC3336的组合在低光照下能做到“看得清、压得小、传得动”。我自己在几个项目里反复验证过核心路径是稳定可靠的具体参数还是要根据你的硬件和场景微调。希望这篇记录能帮你少踩一些我已经踩过的坑。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门