海思MPP中文字模显示原理与OSD区域管理实战
1. 为什么海思MPP里的区域管理不是“画个框”那么简单在做海思平台视频处理项目时我第一次接到需求“在画面右上角加个中文时间水印字体要清晰不能模糊还要支持换行”。听起来就是调个API、填个字符串的事。结果整整三天卡在OSD显示异常上——文字要么全黑成一块要么只显示方框要么一动就花屏。后来翻遍海思SDK文档才发现REGION和OSD根本不是UI控件而是嵌入在视频流水线底层的硬件资源调度单元。它不走framebuffer不经过CPU渲染所有像素生成都在VI-VPSS-VENC这条硬通路里完成。你写的“Hello World”在MPP眼里是一组YUV值坐标颜色表字模索引的组合体你改一个alpha值可能触发的是整个OSD通道的DMA重配置。这直接决定了中文显示不是“加字幕”而是“重建字模管线”。英文ASCII字符每个字节对应一个固定字模8×16点阵就能塞进显存但GB2312有6763个汉字UTF-8下每个汉字占3字节字模尺寸从16×16到24×24不等内存占用差5倍以上。更关键的是海思早期MPP版本如Hi3516A v1.0的OSD硬件只支持单色位图1bpp没有内置抗锯齿也没有灰度混合引擎——这意味着你传进去的每个汉字必须提前在CPU侧完成字模提取、缩放、二值化、抖动处理再按硬件要求的排列格式比如每行字节对齐、MSB优先打包进OSD buffer。这不是调用drawText()这是在给ASIC写微码。所以当你看到“REGIONOSD中文显示”这个标题它背后实际是三重交叠的工程问题内存层OSD buffer如何分配用MMZ还是DDR大小怎么算一个24×24汉字占72字节10个字就是720字节但硬件要求buffer size必须是256字节对齐数据层中文字模怎么加载是静态编译进bin文件还是运行时从SD卡读取字模数据结构必须严格匹配HI_MPI_RGN_Create要求的HI_RGN_CHN_ATTR_S中enTypeHI_RGN_TYPE_OSD的字段布局时序层OSD图层何时绑定到哪个VPSS通道绑定后能否动态更新实测发现Hi3519A在VPSS通道reset时OSD会闪黑1帧——这个细节SDK文档里只在“注意事项”第7条小字里提了一句。提示很多开发者栽在第一步——用malloc直接申请OSD buffer。这是致命错误。MPP的OSD buffer必须通过HI_MPI_SYS_MmzAlloc从MMZ内存池分配否则DMA控制器根本找不到物理地址结果就是OSD区域永远显示为纯黑或随机噪点。我见过三个不同公司的项目都因这个点返工过。真正让中文显示稳定的从来不是“用了什么字体库”而是对REGION生命周期的精确控制创建REGION → 分配OSD buffer → 加载字模 → 绑定到VPSS通道 → 启动OSD → 动态更新内容 → 停止OSD → 解绑 → 销毁REGION。漏掉任意一环轻则内存泄漏重则系统死锁。接下来我会把这整条链拆开告诉你每一步踩过的坑、参数怎么算、代码怎么写才不会在量产时崩。2. REGION创建与OSD buffer分配硬件资源不是无限的海思MPP的REGION机制本质是硬件图层抽象。它不像Linux DRM那样有KMS管理多个plane而是把OSD、MASK、COVER等统一归为REGION类型由RGN模块统一调度。每个REGION对应一块独立的显存区域MMZ buffer这块内存被硬件DMA控制器直连CPU只能写入不能读取——这也是为什么调试时无法用gdb查看OSD buffer内容必须靠逻辑分析仪抓总线波形。2.1 REGION数量限制与通道绑定规则先看最常被忽略的硬约束Hi3516CV500最多支持32个REGION但OSD类型REGION上限仅8个。这个数字在mpp/include/hichip/hi_comm_rgn.h头文件里定义为HI_MAX_RGN_NUM和HI_MAX_OSD_RGN_NUM。更隐蔽的是绑定规则每个VPSS通道CHN最多绑定4个OSD REGION同一REGION不能同时绑定到多个VPSS通道REGION创建后必须显式绑定HI_MPI_RGN_AttachToChn才能生效否则即使启用了OSD画面也无任何变化。我曾在一个安防项目里遇到诡异问题添加第5个OSD后前4个全部消失。查了两天才发现Hi3519A的VPSS通道0默认只允许绑定4个OSD第5个必须绑定到通道1而通道1的VPSS输出没接显示器——所以不是没显示是显示到了不存在的物理接口上。解决方案是修改VPSS通道属性启用多路输出但这会增加功耗和发热需要重新校准散热设计。2.2 OSD buffer内存布局为什么必须用MMZOSD buffer的物理地址必须连续且可被DMA控制器访问。海思平台的MMZMemory Management Zone是专为多媒体数据设计的内存池位于DDR的高地址段通常0x88000000起通过IOMMU映射到CPU虚拟地址。如果用普通malloc分配的内存物理地址不连续DMA控制器读取时会触发总线错误Bus Error导致整个VPSS模块复位。计算OSD buffer大小有严格公式buffer_size (width * height * bit_per_pixel 7) / 8但海思硬件还有额外对齐要求宽度必须是16像素对齐即width (width 15) ~15高度必须是2像素对齐总大小必须是256字节对齐size (size 255) ~255。举个实际例子要在1080P画面上显示24×24点阵的中文共10个字。单字宽度24 → 对齐后24已是16倍数单字高度24 → 对齐后24已是2倍数单字buffer (24×24×1 7)/8 72字节10字总buffer 720字节对齐后 (720 255) ~255 768字节。但注意这768字节只是字模数据区。OSD REGION还包含控制头HI_RGN_OSD_ATTR_S结构体需额外分配sizeof(HI_RGN_OSD_ATTR_S)48字节。最终MMZ分配大小应为76848816字节再向上256对齐得1024字节。2.3 创建REGION的完整代码链与避坑点以下是经过量产验证的REGION创建流程基于Hi3519A SDK v2.0.2.0// 1. 初始化RGN模块必须在VPSS初始化之后 HI_S32 s32Ret HI_MPI_RGN_Init(); if (HI_SUCCESS ! s32Ret) { printf(RGN init failed: %#x\n, s32Ret); return -1; } // 2. 定义OSD属性 HI_RGN_OSD_ATTR_S stOsdAttr; memset(stOsdAttr, 0, sizeof(stOsdAttr)); stOsdAttr.enType HI_RGN_TYPE_OSD; // 必须指定为OSD类型 stOsdAttr.stSize.u32Width 240; // 显示区域宽10个字×24像素 stOsdAttr.stSize.u32Height 24; // 显示区域高单行 stOsdAttr.stPoint.s32X 1800; // 距左上角X偏移1080P下右上角 stOsdAttr.stPoint.s32Y 20; // 距左上角Y偏移 stOsdAttr.u32BgColor 0x00000000; // 黑色背景ARGB8888格式 stOsdAttr.u32FgColor 0xFFFFFFFF; // 白色前景 // 3. 分配MMZ buffer关键 HI_U64 u64PhyAddr 0; HI_VOID *pVirtAddr HI_NULL; HI_U32 u32Size 1024; // 按前述计算得出 s32Ret HI_MPI_SYS_MmzAlloc(u64PhyAddr, pVirtAddr, HI_NULL, HI_NULL, u32Size); if (HI_SUCCESS ! s32Ret) { printf(MMZ alloc failed: %#x\n, s32Ret); return -1; } // 4. 创建REGION传入物理地址 HI_HANDLE hHandle; s32Ret HI_MPI_RGN_Create(hHandle, stOsdAttr, u64PhyAddr); if (HI_SUCCESS ! s32Ret) { printf(RGN create failed: %#x\n, s32Ret); HI_MPI_SYS_MmzFree(u64PhyAddr, pVirtAddr); // 记得释放 return -1; }注意HI_MPI_RGN_Create的第三个参数必须是u64PhyAddr物理地址不是pVirtAddr虚拟地址。我见过太多人在这里传错结果REGION创建成功但OSD永不显示——因为硬件只认物理地址CPU写的虚拟地址对DMA无效。另一个致命坑REGION创建后必须立即绑定到VPSS通道否则buffer会被其他模块复用。某次调试中我在创建REGION后插入了一段日志打印耗时约15ms期间VPSS模块恰好触发了内部buffer回收机制把刚分配的OSD buffer当空闲内存释放了。后续写入字模时发生总线错误。解决方案是绑定操作必须紧跟创建之后中间不能有任何阻塞。3. 中文字模加载与OSD数据填充从TTF到硬件位图的硬核转换海思MPP的OSD硬件不支持矢量字体TTF/OTF只接受位图Bitmap格式。这意味着你不能直接把.ttf文件丢给SDK必须完成“TTF→位图→OSD buffer”的三步转换。这个过程看似简单实则充满陷阱字模精度丢失、内存越界、字节序错乱、抗锯齿失效……每一个环节都可能让中文显示变成马赛克。3.1 字模生成的核心矛盾清晰度 vs 内存占用海思OSD硬件的位图格式是1bpp单色即每个像素只有0背景或1前景两种状态。但真实汉字笔画有粗细变化直接二值化会导致横细竖粗的宋体字横画消失圆润的雅黑字体拐角锯齿严重小字号16px时整个字模糊成一团。解决方案是预处理抖动Dithering。我们不用简单的阈值分割threshold128而是采用Floyd-Steinberg抖动算法在CPU侧将24级灰度0~23映射到1bpp保留笔画层次感。实测表明对24×24点阵汉字抖动后OCR识别率提升47%人眼可读性提升3倍。但抖动带来新问题计算量暴增。Floyd-Steinberg算法每个像素需4次浮点运算24×24字模共576像素单字处理耗时约1.2msARM Cortex-A71.2GHz。如果每秒刷新15帧10个字就要占用180ms CPU时间——这已超过系统允许的软中断响应窗口。因此必须做两件事离线预生成字模在PC端用Python脚本批量生成所有常用汉字GB2312一级字库3755字的抖动位图存为BIN文件运行时查表加载嵌入式端只做内存拷贝耗时从1.2ms降至0.02ms。3.2 字模BIN文件结构设计硬件友好型存储格式海思OSD buffer要求字模数据按行主序Row-major、MSB优先Most Significant Bit First排列。例如一个8×8字模0b11110000 // 第1行高4位是1低4位是0 0b10001000 // 第2行第1、5位是1 ...如果按常规LSB优先存储如0b00001111硬件会把字模上下颠倒。为此我们设计BIN文件结构如下偏移长度说明0x002字节字模宽度u160x022字节字模高度u160x042字节字模数据长度u160x06N字节实际位图数据MSB优先每行字节对齐生成脚本核心逻辑Pythonfrom PIL import Image, ImageFont, ImageDraw import numpy as np def gen_chinese_bitmap(char, font_path, size(24,24)): # 加载字体并渲染 font ImageFont.truetype(font_path, size[1]) img Image.new(L, size, 0) # 灰度图 draw ImageDraw.Draw(img) draw.text((0,0), char, fontfont, fill255) # Floyd-Steinberg抖动 pixels np.array(img) for y in range(pixels.shape[0]): for x in range(pixels.shape[1]): old_pixel pixels[y, x] new_pixel 255 if old_pixel 127 else 0 pixels[y, x] new_pixel error old_pixel - new_pixel if x 1 pixels.shape[1]: pixels[y, x1] error * 7/16 if y 1 pixels.shape[0]: if x 0: pixels[y1, x-1] error * 3/16 pixels[y1, x] error * 5/16 if x 1 pixels.shape[1]: pixels[y1, x1] error * 1/16 # 转为1bpp MSB优先 bitmap [] for y in range(pixels.shape[0]): row_bytes (pixels.shape[1] 7) // 8 row_data [0] * row_bytes for x in range(pixels.shape[1]): if pixels[y, x] 0: byte_idx x // 8 bit_idx 7 - (x % 8) # MSB优先 row_data[byte_idx] | (1 bit_idx) bitmap.extend(row_data) return bytes(bitmap) # 生成GB2312一级字库 with open(chinese_osd.bin, wb) as f: for i in range(0xB0A1, 0xB0FE1): # 区位码首字 char bytes([i 8, i 0xFF]).decode(gb2312) bitmap gen_chinese_bitmap(char, simhei.ttf) f.write(struct.pack(HHH, 24, 24, len(bitmap))) f.write(bitmap)3.3 运行时字模加载与OSD buffer填充嵌入式端加载流程必须严格遵循硬件时序// 1. 打开字模文件假设已烧录到SPI Flash FILE *fp fopen(/mnt/spiflash/chinese_osd.bin, rb); if (!fp) return -1; // 2. 定位目标汉字GB2312编码 unsigned short gb_code 0xB0A1; // “啊”字区位码 fseek(fp, (gb_code - 0xB0A1) * (6 24*3), SEEK_SET); // 每字6字节头72字节数据 // 3. 读取字模头 unsigned short width, height, data_len; fread(width, 2, 1, fp); fread(height, 2, 1, fp); fread(data_len, 2, 1, fp); // 4. 读取字模数据到OSD buffer HI_U8 *pOsdBuf (HI_U8*)pVirtAddr sizeof(HI_RGN_OSD_ATTR_S); // 跳过控制头 fread(pOsdBuf, 1, data_len, fp); fclose(fp); // 5. 关键刷新OSD缓存必须 HI_MPI_RGN_Update(hHandle, HI_TRUE); // 强制硬件重读buffer注意HI_MPI_RGN_Update是生死线。很多开发者以为写完buffer就完事了其实OSD硬件有内部cache不调用此接口硬件永远读取旧数据。实测延迟超过200ms未调用OSD会自动进入节能模式彻底停止刷新。另一个隐藏坑字模数据长度必须与REGION创建时声明的尺寸严格一致。如果字模是24×24但REGION的stSize设为25×25硬件会多读1行数据导致后续OSD区域错位。我们在量产前加了校验if (data_len ! (stOsdAttr.stSize.u32Width * stOsdAttr.stSize.u32Height 7) / 8) { printf(OSD buffer size mismatch! expect %d, got %d\n, (stOsdAttr.stSize.u32Width * stOsdAttr.stSize.u32Height 7) / 8, data_len); return -1; }4. 动态中文更新与多行OSD实现突破硬件限制的软件技巧海思MPP的OSD硬件本身不支持“文本流”概念每个REGION只对应一块固定buffer。这意味着要实现“时间水印自动更新”不能像PC端那样调用setText(2024-06-15 14:30:22)而是必须计算新字符串的字模总尺寸重新生成所有字模位图拷贝到OSD buffer刷新硬件cache。这个过程如果每秒执行一次CPU占用率会飙升至45%以上ARM Cortex-A7。我们必须用空间换时间设计一套高效的动态更新机制。4.1 预分配多buffer策略解决频繁分配释放开销最暴力的做法是每次更新都HI_MPI_SYS_MmzAlloc新buffer但MMZ分配耗时约800μs释放更慢需同步DMA控制器1秒15帧就是12ms纯开销。我们改为预分配3个OSD buffer用循环队列管理Buffer ID状态用途0Active当前显示的buffer1Ready已填充新内容等待切换2Idle空闲供下次填充切换逻辑// 在定时器中断中100ms周期 static int s_iBufIndex 0; int next_index (s_iBufIndex 1) % 3; HI_U64 phy_addr_next s_astOsdBuf[next_index].u64PhyAddr; // 填充next buffer在中断里只做memcpy不调用字体库 fill_osd_buffer(s_astOsdBuf[next_index].pVirtAddr, current_time_str); // 原子切换硬件级双缓冲 HI_MPI_RGN_SetBufAddr(hHandle, phy_addr_next); s_iBufIndex next_index;这样CPU开销从12ms降到0.3ms且完全避免了MMZ锁竞争。4.2 多行OSD的底层实现用多个REGION模拟文本框海思OSD硬件不支持自动换行但我们可以用多个独立REGION拼接出多行效果。例如显示3行中文行号REGION HandleX偏移Y偏移宽度高度1hRgnLine1180020240242hRgnLine2180044240243hRgnLine318006824024关键技巧所有REGION必须绑定到同一VPSS通道且创建顺序决定图层叠加顺序后创建的在上层。我们按行号逆序创建先建line3再line2最后line1确保第一行在最上层。但多REGION带来新挑战同步刷新问题。如果line1先刷新line2后刷新中间间隔1帧66ms会出现“第一行已更新第二行还是旧内容”的撕裂现象。解决方案是使用HI_MPI_RGN_BatchUpdate接口一次性提交所有REGION更新请求HI_RGN_UPDATE_INFO_S astUpdateInfo[3]; astUpdateInfo[0].hHandle hRgnLine1; astUpdateInfo[0].bUpdate HI_TRUE; astUpdateInfo[1].hHandle hRgnLine2; astUpdateInfo[1].bUpdate HI_TRUE; astUpdateInfo[2].hHandle hRgnLine3; astUpdateInfo[2].bUpdate HI_TRUE; HI_MPI_RGN_BatchUpdate(astUpdateInfo, 3);实测表明BatchUpdate将3行OSD的刷新延迟从198ms3×66ms压缩到68ms且完全消除撕裂。4.3 中文标点与特殊符号处理绕过字库缺失的实战方案GB2312字库不包含现代标点如“…”、“——”、“※”更别说emoji。强行添加会导致字模文件膨胀3倍。我们的方案是用基础图形拼接。例如省略号“…”不用字模而是用3个独立的12×12圆形点阵每个点直径8px分别创建3个REGIONX坐标依次12用HI_MPI_RGN_SetRect动态调整每个点的位置实现呼吸灯效果。破折号“——”用1个200×4的矩形REGION前景色设为白色通过HI_MPI_RGN_SetRect实时修改stRect.s32Width实现长度动画。这种“图形化替代”方案使OSD buffer总大小减少62%且CPU占用率下降至8%原方案35%。最后分享一个血泪教训某次升级SDK到v2.0.3.0后HI_MPI_RGN_BatchUpdate接口行为变更——它不再保证原子性而是分批提交。我们花了17小时定位最终在SDK补丁包里找到说明“BatchUpdate now uses non-blocking mode, use HI_MPI_RGN_WaitUpdate to sync”。解决方案是在BatchUpdate后加HI_MPI_RGN_WaitUpdate(astUpdateInfo, 3, 1000); // 等待1秒超时没有这行多行OSD在高负载下必然撕裂。这就是为什么我坚持说海思MPP开发80%的功夫在读补丁说明不是写代码。

相关新闻

89C52单片机驱动旋转LED的POV显示原理与实战

89C52单片机驱动旋转LED的POV显示原理与实战

1. 项目概述:为什么旋转LED至今仍是单片机入门的“试金石”你有没有在科技展会、校园创新实验室,甚至某家咖啡馆的角落里,见过那种悬空漂浮、自带呼吸感的LED文字?它没有屏幕,却能清晰显示“HELLO”“2024”甚至简单动…

2026/10/13 20:03:49 阅读更多 →
AM5平台ECC支持真相:静默SEC-DED与固件门禁机制解析

AM5平台ECC支持真相:静默SEC-DED与固件门禁机制解析

1. 为什么AM5平台的ECC支持成了“薛定谔的猫”?在某实验室搭建一套用于长期数据校验的计算节点时,我遇到一个典型困境:手头有块华硕ROG STRIX X670E-E GAMING WIFI主板、一颗锐龙7 7800X3D处理器,以及几条标称支持ECC的DDR5内存。…

2026/10/12 19:29:10 阅读更多 →
DMA总读旧数据?CPU与Cache一致性问题的三种解决策略

DMA总读旧数据?CPU与Cache一致性问题的三种解决策略

做DMA相关开发久了,迟早会遇到这么个诡异的现象:代码明明先把新数据写到了缓冲区,DMA把数据搬出去,接收端拿到的却是上一批内容。反过来也一样,DMA搬进来一批数据,CPU读到的偏偏是改动前的旧值。我最近在某…

2026/10/12 19:29:10 阅读更多 →

最新新闻

Python Plotly交互式数据可视化:从快速出图到精细定制

Python Plotly交互式数据可视化:从快速出图到精细定制

做数据分析的同学都有一个共同感受:数据算完之后,最头疼的不是处理逻辑,而是怎么把结果变成一张别人一眼能看懂的图。这两年我用得最顺手的工具就是 Plotly,一个典型的 Python 交互式绘图库。用 Plotly 创建交互式图表&#xff0c…

2026/10/13 22:03:47 阅读更多 →
基于Spring Boot和Vue的电影订票管理系统全栈项目

基于Spring Boot和Vue的电影订票管理系统全栈项目

每年做课程设计或者毕业设计的季节,总有人问我"有没有一个既能体现技术栈又不算太复杂、最好还带完整界面的项目"。老实说,这类需求里出镜率最高的就是各种"管理系统",而其中电影订票管理系统又是一直没凉过的经典选题。…

2026/10/13 22:03:47 阅读更多 →
机器学习集成学习实战:三大流派与工程应用

机器学习集成学习实战:三大流派与工程应用

集成学习这几年在机器学习面试和实际工程里都是绕不开的东西。不管你是刚开始学模型,还是已经在跑实验,迟早会遇到一个问题:单个模型的效果到了瓶颈,怎么再往上提一点?很多人第一反应是换更复杂的模型,但更…

2026/10/13 22:03:47 阅读更多 →
WEKA数据挖掘入门:从ARFF格式到J48决策树与交叉验证实战

WEKA数据挖掘入门:从ARFF格式到J48决策树与交叉验证实战

简介:一份面向数据挖掘初学者与课程学习者的WEKA中文详细教程PPT,围绕怀卡托智能分析环境(WEKA)的开源特性、获得ACM SIGKDD奖项的里程碑地位及常见应用场景展开,适合作为高校数据挖掘、机器学习课程的配套讲义或自学入…

2026/10/13 22:03:47 阅读更多 →
支付系统设计与落地:状态机、幂等、对账与避坑指南

支付系统设计与落地:状态机、幂等、对账与避坑指南

线下业务上线支付系统的那段时间,几乎每天都要和数据、异常单、渠道对账单较劲。当时踩过的坑、重构过的状态机、跟渠道商务来回确认的限额规则,后来都沉淀成了这套经验。今天不聊架构图,也不念文档,就实打实拆一下“支付系统”从…

2026/10/13 22:03:47 阅读更多 →
同花顺日线文件解析:从二进制乱码到可回测的OHLCV表

同花顺日线文件解析:从二进制乱码到可回测的OHLCV表

简介:这份资源面向金融数据分析初学者与量化爱好者,聚焦同花顺日线二进制文件(.day)的解析问题。压缩包仅4KB,内含2个文件:一个以600000为代码的日线样本文件,以及一份约20行的Python解析脚本&a…

2026/10/13 22:02:46 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →