老早以前,我给一台老式模拟枪机做改造,摄像头本身不带时间水印,后端录像机的OSD又只能加到整路录像上,换台带自定义OSD的机器,价格翻一倍还不止。后来我试了用AT7456E(资料里通常标MAX7456兼容)这颗专门干“视频字幕”的芯片,配合STM32把时间水印和Logo直接叠到模拟视频信号里,效果出奇地稳。这篇就把这套方案从头到尾拆开:为什么选它、怎么接线、字符和Logo怎么做进去、时间怎么刷新,以及我踩过的坑和排查思路。
如果你正在做监控摄像头改造、视频叠加开发,或者单纯想给自己的图传/监视器加个信息层,这篇文章可以直接拿来当操作手册。全程不需要改摄像头内部固件,也不需要后端电脑做识别叠加,只要视频信号是CVBS模拟输出,就能在硬件链路上完成叠加,延迟在毫秒级,非常实用。
1. 先说结论:为什么模拟视频时代的老办法,还能解决今天的监控痛点
刚听到“用AT7456E给监控加OSD”的朋友,第一反应多半是:现在的摄像头不都自带OSD吗?IPC网络摄像头不是能在后台叠时间、叠标题吗?这话没错,但实际工程里经常碰到三种情况,自带OSD根本解决不了。
1.1 OSD叠加的需求,很多时候是固件给不了的
大部分家用和行业摄像头的OSD功能确实很完整,能在菜单里开时间、改标题。但它的限制也很明显:字符样式固定、位置固定、内容类型有限,你想把GPS坐标、环境温度、报警状态这些自定义信息叠进视频流,固件层面根本不开放。非要做到,要么上后端软件处理,要么换更贵的设备,要么只能在视频压缩后再做二次编码,延迟和画质损耗都很难看。
我见过不少做移动监控的朋友,车上的4G摄像头带GPS定位,平台能在地图上看到位置,但录像画面里没有经纬度信息。后来有人提需求:能不能把定位数据直接“烧”在画面里?这样才能保证录像文件拿出去,别人一眼就能看到位置、时间、车辆编号,不用再对平台。这种需求用摄像头自带OSD基本无解,而外挂OSD芯片就是最直接的硬件级方案。
1.2 外挂芯片方案的三大好处
- 不改原机固件,风险低。芯片接在摄像头视频输出和后端显示/录像设备之间,是纯硬件插入,不会影响摄像头本身的编码、网络、云台等功能。
- 叠加延迟低,不受编码影响。AT7456E处理的是模拟CVBS信号,整条链路从输入到输出只是内部视频处理,叠加后再输出给后端设备。相比“先解码、再识别、再编码”的软件方案,延迟几乎可以忽略。
- 字符内容可控,MCU说了算。想显示什么内容,完全由外部单片机通过SPI接口写入芯片字符存储器,意味着你可以接GPS模块、接温湿度传感器、接报警IO,想叠什么就叠什么。
1.3 哪些设备适合加,哪些设备别硬上
适合加AT7456E的,是带CVBS模拟输出的摄像头:老式模拟枪机、半球机、部分支持CVBS输出的混合型DVR摄像机、车载摄像头、FPV图传摄像头。改造时直接从视频输出口取信号,串入OSD板就行。
不适合的,是那种纯网络IPC且没有模拟输出的机器,信号源本身就是网线里的RTP流,根本没有CVBS接口给芯片处理。还有现在一些4G球机输出的是数字信号,也没有模拟视频端子,那就别硬上,硬接只会把主板烧了。
提示:这里的“OSD”不是摄像头菜单里的屏幕显示功能,而是指视频信号叠加文字/图形层。AT7456E的作用是在视频画面上叠加字符层,所以信号链路里必须有可以插入的模拟视频节点。
2. 认识AT7456E这颗“字幕机”:原理、寄存器与准备工作
AT7456E本质上是一颗视频字符叠加芯片,你可以把它理解成一个“硬件字幕机”。输入一路CVBS视频,输出的还是同样制式的CVBS视频,但画面上已经被叠加了字符层,字符内容由外部MCU通过SPI控制。
2.1 AT7456E/MAX7456到底是什么
MAX7456是Maxim最早推出的一颗OSD芯片,在FPV穿越机图传里用得非常广,后来国内厂商做了很多引脚兼容、寄存器基本一致的版本,AT7456E就是市面上很常见的一个替代型号。这颗芯片内部集成了一整套视频同步、字符存储和混合输出逻辑,支持NTSC和PAL两种视频制式,字符存储器可以容纳512个自定义字符。
关键点在于,它的字符不是点阵字库芯片那种“中文字库”或“ASCII字库”,而是把字符做成图像位图,烧写进芯片内置的字符存储器里。每个字符对应一个固定大小的点阵区域,比如NTSC下常见规格是12×18像素,PAL下类似。用工具把Logo、字母、数字、符号做成一格格点阵数据,通过SPI写入,叠加时只需告诉芯片“在第几行第几列显示第几个字符”就行。
2.2 字符叠加的底层逻辑
视频信号是一帧一帧扫出来的,模拟CVBS里包含行同步和场同步信号。AT7456E先接收输入视频,从视频信号里提取同步信息,确定当前扫描到哪一行、哪一列,然后在对应位置把字符层“叠加”上去。字符层来自芯片内部RAM里的字符存储器,外部MCU要做两件事:一是提前把字模数据写进去,二是在运行时告诉芯片每个位置的字符编号和显示属性。
显示属性和位置由寄存器控制。最常用的是三个寄存器组:
- VM0/VM1:视频模式、OSD使能、背景亮度、字符闪烁控制等。
- HOS/VOS:字符显示区域的起始位置,通过水平和垂直位置寄存器设定。
- DMM/DMA:字符显示模式和管理地址,用于把字符缓冲里的内容刷到屏幕上。
不建议把这些寄存器值背下来,每个版本文档的寄存器地址可能略有差异,正确做法是新品到手先认真读数据手册,再对照代码改。网上很多Arduino/STM32的开源驱动,基本都能直接跑,但如果你用的PCB版本和参考代码不一样,踩坑之后大概率还是要回到手册上查。
2.3 物料清单和接线准备
这块芯片最常见的形态是“OSD叠加板”,买回来已经焊好AT7456E、视频座、SPI排针和电源稳压,非常适合快速验证。自己画板子也不难,就是引脚较密,手工焊接需要点耐心。
| 物料 | 规格/型号 | 作用 |
|---|---|---|
| OSD叠加板 | AT7456E/MAX7456,成品板即可 | 完成视频叠加 |
| MCU主控 | STM32F103、Arduino Nano等 | 通过SPI控制芯片 |
| 视频源 | 带CVBS输出的摄像头 | 提供输入视频 |
| 显示器/采集卡 | 带CVBS输入的监视器或采集卡 | 观察叠加结果 |
| GPS模块 | NEO-6M等(可选) | 扩展叠加定位信息 |
| 电源 | 5V/3.3V根据板载要求 | 给OSD板和MCU供电 |
| 杜邦线/同轴电缆 | 常规 | 接线和信号连接 |
接线要点:摄像头CVBS输出接到OSD板视频输入,OSD板视频输出再接后排监视器或录像机。MCU的SPI引脚(SCK、MOSI、MISO、CS)对应接OSD板,电源必须共地。很多新手第一板起不来的原因就是视频源、OSD板、显示设备三者地电位不一致,导致画面波纹严重或者干脆黑屏。
注意:AT7456E输入输出的视频电平标准是1Vp-p,摄像头输出也应按这个标准。有些摄像头输出电平偏低,叠加很容易出现画面发暗或者字符发虚,后面排查部分会细说。
3. 实操五步:时间水印和Logo叠加全流程
标题里说的“5步”不是客套话,按这个顺序做,基本一次通电就能看到画面。核心顺序是:先通视频,再通SPI,再写字模,最后动态刷新。
3.1 第一步:先把视频通路接通,让OSD芯片“看”到画面
不要一上来就写代码。我习惯先把电源和视频线接好,让OSD板处于直通状态,在监视器上确认“输入有水波、输出能显示”。这一步看起来简单,实际上能筛掉一半的问题。
做法是:摄像头CVBS接OSD板AV IN,OSD板AV OUT接监视器,给OSD板上电。正常情况监视器应当直接看到摄像头画面,即使OSD还没开启,芯片也是直通视频的。如果这一步就没有画面,先不要碰代码,重点查三处:
- 电源电压和电流是否足够。很多OSD板对电源纹波敏感,用USB供电时最好加个100uF电解电容。
- 视频线和连接器是否接触良好。CVBS信号频率不高,但接触不良会导致阻抗不均,画面出现重影或雪花。
- 视频制式是否匹配。摄像头输出PAL,显示器也要设定PAL,混着用容易画面滚动。
等监视器出现稳定图像,再继续进行SPI部分。此时芯片还没有叠加任何东西,但至少表明视频链路是通的。
3.2 第二步:SPI驱动与芯片初始化
AT7456E用标准SPI接口和MCU通信,一般用模式0或模式3,具体看手册。通信格式很简单:CS拉低,发送寄存器地址字节,再发送数据字节,CS拉高。关键在初始化顺序,不能想当然乱写寄存器。
下面是基于STM32的示例框架,实际使用时按自己的单片机库改一下即可。工程里即使不开OSD开关,我也习惯在初始化里先设好视频制式、字符对比度和字符存储器地址。
// 初始化OSD芯片 void osd_init(void) { uint8_t i; // 关闭OSD显示,进入配置模式 osd_write_reg(0x00, 0x00); // VM0: OSD关闭 delay_ms(10); // 设置视频制式为PAL,如果摄像头是NTSC就改为对应值 // 具体bit请以数据手册为准 osd_write_reg(0x00, 0x20); // 假设bit5设为PAL制式 // 关闭字符闪烁、设置字符亮度中等 osd_write_reg(0x01, 0x00); // VM1: 默认亮度 // 清除字符存储器中的显示缓冲 for (i = 0; i < 64; i++) { osd_write_reg(0x04, i); // DMA: 显示缓冲区地址 osd_write_reg(0x05, 0x20); // DMM: 写空白字符 } // 开启OSD显示 osd_write_reg(0x00, 0x40); // 打开OSD叠加 }这段代码不是让你直接抄完事,它演示的是初始化逻辑:先保证视频制式正确,再清屏,最后才开OSD开关。很多板子默认字符存储器不是空白,通电后直接开OSD会看到一堆乱码或残影,所以“清屏”这步必须做。
调试技巧:先用最简单的“第3行第5列显示字符A”这种命令验证显示通路。只要屏幕上出现字符,再去做字模和动态刷新就不慌了。
3.3 第三步:把Logo变成芯片字库里的一个字符
这是整个过程中最耗时间的一步。AT7456E支持512个字符,每个字符本质是一个点阵位图。比如NTSC制式下通常是12×18像素,你需要把希望显示的字母、数字、Logo图标都转为这个规格的点阵数据。
工具方面,网上有开源的字符生成器和在线点阵转换工具。流程一般是:
- 准备一张黑白PNG或BMP图片,尺寸最好直接做成12×18,如果Logo原始尺寸不是这个比例,先在画图软件里等比缩放并居中。
- 用转换工具把图片导出为二进制数组,最好能按AT7456E的位序排列。注意像素顺序和位顺序,不同工具导出的排列方式不一样,直接烧进去很可能字是反的或者乱的。
- 把数组通过SPI写入指定字符存储器的地址。每个字符存储区是一个独立的地址段,写之前要设置好写地址寄存器。
// 写入一个字符的字模数据 void osd_write_char(uint8_t char_index, const uint8_t *bitmap) { uint16_t addr = char_index * 54; // 54 = 12列 * 4.5,实际字节数以手册为准 // 设置写地址 osd_write_reg(0x05, addr & 0xFF); // DMM低位 osd_write_reg(0x06, (addr >> 8) & 0xFF); // 高位 // 一次写入一个字符的所有像素行 for (uint8_t line = 0; line < 18; line++) { // 写入位图数据,具体方式和寄存器请查数据手册 osd_write_data(bitmap[line]); } }这里想强调:不同芯片版本对字符字节数的定义有差别,有的字符是12×18,有的可能是12×16,我上面写的54只是示意,千万不要拿着这个字节数直接套到自己的板子上。最稳妥的办法是先写一个测试字模,比如全黑、全白、棋盘格,确认显示正常再写正式Logo。
Logo显示位置的设置也容易忽略。芯片默认字符位置在画面左上角,如果你要在右下角加Logo,需要设置行列偏移寄存器。偏移单位是“字符行”和“字符列”,不是像素,所以你要计算的是:画面总共能容纳多少列字符,然后减去Logo占的列数,就能得到合适的偏移值。
3.4 第四步:叠加时间水印并动态刷新
时间水印的难点不在于“显示时间字符串”,而在于“动态刷新字符串时不能产生闪烁和拖影”。
大多数AT7456E驱动库里,字符串刷新都是直接往显示缓冲区写字符编号。比如显示“2025-06-01 14:30:25”,MCU先把字符串转成对应字符编号数组,然后逐位置写入芯片的显示缓冲区。但如果你把整个字符串每秒钟整体刷新一次,就会出现明显的闪烁。
比较好的做法是“只刷新变化的字符位置”。时间是逐秒变化的,秒位每秒变一次,分钟位每60秒变一次,小时位更慢。实际编程时,我只刷新需要变化的字符位置,把“时分秒”分成三个独立区域,每秒只重写秒位以及可能变化的进位位。这样刷新量极小,字符不会闪。
另外要注意RTC时钟源。MCU内部定时器走得再准,长期运行也会漂。工程上建议外接DS3231之类的RTC模块,自带晶振和温补,断电还能靠电池保持。这样录像画面里的时间才是可信的法律证据,不然时间错了反而麻烦。
// 每秒刷新一次时间显示 void update_time_osd(void) { static uint8_t last_sec = 0xFF; char time_str[9]; get_rtc_time(time_str); // 从RTC读取时间字符串,比如 "14:30:25" // 只刷新秒位变化的部分 if (time_str[6] != last_sec_str[6] || time_str[7] != last_sec_str[7]) { osd_display_string(1, 20, &time_str[6]); // 在固定位置显示秒 } // 分钟和小时按其进位频率刷新,逻辑类似 }提示:时间字符串里的冒号“:”也要占用一个字符位置,而且冒号一般每秒闪烁一次,用来提示用户这个时间“正在走”。如果不希望冒号闪烁,可以固定显示;如果需要闪烁效果,可以把冒号所在的字符区域按秒刷新成空格或冒号。
3.5 第五步:整机装配与显示效果验证
叠加板调试通过后,就该把它封装进摄像头外壳或者控制箱里了。这步决定长期稳定性,不能草草用胶带一缠就交付。
- 供电走线尽量短且粗,OSD板和摄像头最好分开供电,避免摄像头电机启动瞬间拉低电压导致OSD字符发黑。
- 视频线用屏蔽线,屏蔽层单端接地,防止叠加板上的数字信号串扰进视频。
- 机箱里合理固定板子,我做的时候习惯用尼龙螺柱加绝缘垫片,避免板子背面焊点碰到金属外壳导致短路。
- 加电后用万用表确认各路电压正常,再合盖。合盖前最好在目标光照条件下实测一下字符清晰度,因为不同亮度的画面里,同一组字符亮度和对比度参数,观感会差很多。
显示效果验证也别只盯着静态画面。实际录像场景会动,字符边沿是否有残影、叠加后视频亮度是否下降、长时间通电字符会不会漂移,这些都是验收点。我建议至少连续通电24小时,重点观察字符位置有没有发生像素级偏移,时间刷新是否准确。
4. 常见问题排查:画面不进、花屏、字符闪烁怎么办
这部分是给已经动手、卡在某个现象里的朋友看的。下面是我根据自己的经验和网上常见案例整理的速查表,照着排查能省很多时间。
4.1 现象速查表
| 故障现象 | 大概率原因 | 排查手段 |
|---|---|---|
| 黑屏,无视频输出 | 视频输入信号没有进入芯片 | 用示波器或另一台监视器直接测摄像头CVBS输出 |
| 有视频但无OSD字符 | OSD开关未开启 | 检查VM0寄存器bit设置是否正确 |
| 字符乱码/显示错误字符 | 字模数据位序不对 | 先写全0或全1测试字模,确认字符存储器写入正确 |
| 字符闪烁 | 动态刷新策略不当 | 改为局部刷新,避免整行或多行重写 |
| 画面滚动/上下跳动 | 视频制式不匹配 | 确认摄像头和芯片同时为PAL或同时为NTSC |
| 画面有斜纹/波纹干扰 | 电源纹波或共地不良 | 加强电源滤波,检查地线连接 |
| 文字发虚/边缘模糊 | 输入视频幅值偏低 | 测量CVBS输出幅值,必要时添加视频驱动缓冲 |
| 显示位置偏移 | 同步信号不稳定或行列扫描位置设置错误 | 检查输入视频同步信号,重新设置HOS/VOS |
4.2 三个容易被忽略的坑
第一个坑是“字符抖”。你可能会发现字符上下轻微抖动,不是闪烁,而是像在水里晃。这个多半不是OSD芯片的问题,而是输入视频信号本身时基抖动大。很多老摄像头或经过长线传输后的CVBS信号,同步头不够干净,芯片提取同步位置就会有小偏差。解决思路是缩短视频线、在输入端并一个75Ω匹配电阻,或者换一个视频输出更稳定的摄像头试试。
第二个坑是“先写后开”的顺序。有些驱动在初始化里直接开OSD,但芯片内部的字符存储器还是上电默认的随机值,结果屏幕上出现一大片无意义的乱码。正确顺序是先清屏,或者先全部写空格字符,最后再开OSD使能位。我见过不少人花一整天查为什么字库字符错乱,最后发现是没做清屏。
第三个坑是“3.3V主控和5V板子混接”。AT7456E工作的IO电平一般可以兼容3.3V,但有些OSD叠加板上拉电阻是接到5V的,MCU的SPI输出如果不加电平转换或者不确认是否兼容,轻则字符识别不稳定,重则烧坏主控引脚。最安全的做法是确认板子的逻辑电平和MCU一致,实在不行加电平转换模块。
4.3 配合“改参数软件”类需求时的思路
网上一搜“修改监控摄像头参数的软件工具”,能找到不少改摄像头码率、分辨率、帧率的工具。这类工具针对的是摄像头本身的参数,和AT7456E叠加是两条路线。OSD芯片不管摄像头参数,它只负责“叠加显示”。
但你可以把外置参数采集和OSD叠加结合起来:比如采集摄像头后端录像机的帧率显示,或者从串口读取传感器数据,把参数实时叠到监视画面上。这样一来,即使摄像头固件不开放,画面上的关键参数也能一屏打全。和在电脑上用软件改参数相比,这种方式不影响摄像头正常工作,录像画面里还带可追溯的信息,对工程验收来说非常友好。
5. 除了时间水印,AT7456E还能怎么玩
把基础功能跑通之后,这颗芯片的扩展空间比想象中大。尤其是“显示什么完全由MCU决定”这个特性,意味着你可以把任何能通过串口/IO读到的数据叠到画面上。
5.1 移动监控叠加GPS坐标,做个带GIS信息的画面
“移动监控摄像头带GIS信息”这需求,光靠摄像头自带的定位能力很难实现。平台上有地图坐标,但录像里没有,这就需要OSD硬件层补上。做法很简单:GPS模块接MCU串口,解析出经纬度、速度、方向,格式化成字符串,再通过字符显示函数叠加到视频画面角落。
我做过一个车载项目,画面左下角显示“经度、纬度、速度”,右下角显示时间,中间还可以叠加车牌号。这样录像文件拷下来,随便一帧都能直接当证据材料。关键是GPS数据更新频率一般1Hz,刷新OSD的节奏保持在1秒一次即可,不要太频繁,否则会干扰字模显示。
5.2 多模板切换与低照度敏感性保护
有朋友问“晚上全彩模式灵敏度低,再叠加OSD会不会更糟”。这里要分清楚,OSD叠加是在视频输出链路上做的,不会改变摄像头传感器的曝光策略,所以它不会直接降低“全彩模式”的灵敏度。真正影响低照度表现的,是你叠加后的视频如果还要经过一次采集或编码,等于多了一级处理,理论上会有轻微损失,但绝大多数工程场景根本看不出来。
为了保护夜间效果,建议把OSD字符亮度调低,避免大面积白色字符在暗光画面里造成刺眼的过曝。同时注意,如果摄像头本身在全彩模式下的信噪比就不高,叠加芯片输入端的信号质量会更差,所以这类改造更适合在光线相对稳定的场景,或者选择低照度性能较好的摄像头。
多模板切换也很有意思。比如白天用“时间+Logo+车牌”,夜间用“时间+坐标+报警状态”,由MCU根据环境光线传感器或定时器切换。只需要在MCU里维护几套显示缓冲内容,按条件调用刷新函数即可,不用改动任何视频硬件。
最后分享一个我的体会:AT7456E这类芯片看上去是“老技术”,但做安防叠加、移动监控数据叠加时,它反而是最稳、成本最低的路线之一。很多项目拍脑袋上智能分析服务器做OCR和叠加,除了延迟大、价格贵,还容易在弱光场景翻车。而一颗十几块的芯片加一个几块钱的单片机,就能把时间、坐标、Logo这类确定性信息稳稳印在每一帧画面上。如果你手里正好有带CVBS输出的摄像头和闲置的OSD板,完全可以照这个流程试一圈,大概率一晚上就能跑通。