IPC客户端实战:用Python和psutil排查进程间通信故障
简介一份使用Visual C编写的网络摄像头客户端工程基于ONVIF标准与摄像头完成视频预览、图像抓拍、参数设置适合正在学习网络编程、图像处理及多线程开发的Windows开发者参考。压缩包约四十五兆内含三百七十四个文件核心包括头文件、C源文件另有目标文件、动态链接库、位图界面、可执行程序及工程配置覆盖从源码阅读到编译运行的完整链路大量位图资源与动态库有利于理解界面与功能模块工程文件则可辅助重新构建。该工程已有三百七十六人次学习属于功能完整、便于上手的监控客户端实现。通过研读可掌握套接字通信、实时视频流解析、图像显示、设备命令封装等关键技能也借鉴其错误处理与界面交互方式为后续扩展录像存储、云服务、人脸识别等高级功能打下基础。1. IPC 客户端线上卡顿时的第一排查工具上一次排查某平台卡顿A 模块写完数据B 模块始终读不到延迟从几十毫秒一路涨到两秒多。日志看不出哪端在等CPU 和内存又都正常最后是靠一套 IPC 客户端脚本把共享内存、消息队列、信号量和 Socket 状态挨个拉出来才发现消息队列积压了十几万条。这里要拆的这份资源就是这样一个 IPC Client在 Windows 和 Linux 上把管道、共享内存、消息队列、信号量、Socket 连接一次性枚举出来按进程归好类导出成 JSON 快照。它不是什么 IPC 原理讲义而是一套能直接改、直接跑的 Python 工具包适合后端开发、运维和正在做跨进程模块改造的测试同学。2. IPC 原理与选型为什么先看句柄再看队列长度IPC 全称叫 Inter-Process Communication本质上就是进程间的数据和信号交换。排查这类问题最忌讳一上来就盯日志。日志是业务视角跨进程通道卡死时业务往往还停在某次 write 或 read 上日志里只有超时。正确顺序应该是先看通信通道的状态再回到业务代码。这套资源里的采集模块就是按这个顺序设计的。2.1 管道、共享内存与消息队列的监控点不同 IPC 形态需要看的指标完全不同。我拆这份资源时发现它的采集项不是拍脑袋列的而是按排障经验归出来的。通信类型监控指标典型异常管道连接数、缓冲区占用、读写端是否存在写端关闭但读端阻塞共享内存映射次数、引用计数、当前映射地址内存泄漏映射地址失效消息队列当前条数、最大字节数、读写权限队列积压消费端掉线信号量当前值、最大计数、等待线程数死锁、获取超时Socket连接状态、句柄数、本地/远端地址TIME_WAIT 堆积、句柄泄漏管道和 Socket 重点看“两端的进程是否还在”只要有一端退出另一端就会悬空消息队列和共享内存重点看“积压量和引用”积压涨得快说明消费速度跟不上生产速度。信号量则要留意当前值是否为 0长时间为 0 基本等于锁死。采集层把这些指标统一拍成快照比对着任务管理器一个个数进程靠谱得多。2.2 为什么选 Python psutil而不是 C 原生工具资源包最初的版本其实是 C 写的原生小工具。功能不差可一旦换操作系统枚举句柄和连接表的代码就得重写。后来我上手维护时把它改成了 Python psutil 的组合。psutil 在 Linux 下读 /proc在 Windows 下调系统 API接口完全一致。采集进程连接、文件描述符、句柄数、用户名这些基础信息不需要自己折腾平台差异。对比下来方案可移植性上手成本适合场景C 原生工具一般高深度集成进产品Python psutil好低现场排障、例行巡检大型监控平台好中长期布点重资产这套资源定位就是“现场排障 例行巡检”Python 版本最合适。代价是采集大进程时会有几十毫秒的开销但比起问题定位成本完全值得。而且 psutil 的进程快照接口支持过滤字段按 pid、命令行、用户名筛完再采集能让一次巡检的开销压到很小。2.3 通信令牌与名称编码规则跨进程通道最麻烦的一点同一个可执行程序可能被拉起多个实例进程名看不出谁是谁。资源包里处理这个问题的方式是引入一个 tag 配置也就是通信令牌。核心思路是先定义每类进程的 tag再在采集时通过进程名或命令行去匹配最后把 IPC 状态归到 tag 下面。# profiles/ipc_default.json —— 配置模板按实际业务改 tag 与 match { client: { name: ipc-client, version: 1.0 }, filter: [ {tag: saver, match: process_name, value: data_saver}, {tag: loader, match: cmdline, value: --modeloader} ], probe: { interval: 5, kind: inet, collect_shm: true, collect_mq: true, export_json: ./ipc_report.json } }match 字段支持两种取值process_name 直接匹配进程名cmdline 匹配启动参数。value 是关键字子串。这段配置的本意是让采集结果最终呈现为“哪个业务角色在使用哪些 IPC 通道”而不是“某个进程在运行”。查问题的时候你首先关心的是业务模块而不是 pid。3. 搭建 IPC 客户端采集模块、命令行参数与 JSON 报告这一章是把整套客户端从零搭起来的过程。代码部分基本就是资源包里的原版脚本配置文件需要按实际环境改。我按照“环境准备 → 核心采集 → 命令行整合 → 报告渲染”的顺序拆开每一步都给了可直接抄的代码。3.1 环境准备与依赖安装运行时只需要 Python 3.8 以上和 psutil没有其他第三方依赖。为什么不用 netifaces 之类的库因为标准库里的 ipaddress 已经能处理地址解析采集层并不需要额外抽象。# 确认 Python 版本建议 3.8 python --version # 安装/升级 psutil pip install --upgrade psutil # 如果之前装过旧版建议先卸掉再重装避免动态库不匹配 # pip uninstall psutil -y # pip install psutil # 验证安装结果 python -c import psutil; print(psutil.pid_exists(1))最后一条命令输出 True说明 psutil 能正常访问系统进程表。Linux 上以普通用户运行时部分系统进程的元数据会读不全这是内核权限限制不是脚本问题。注意Windows 上建议用管理员身份运行命令行否则其他用户启动的进程句柄列表是空的。3.2 核心采集进程、句柄与 IPC 连接快照核心采集模块负责在某一瞬间把所有进程的 IPC 状态拍下来。这里的关键是遇到权限不足的进程要跳过并计数而不是让整个采集崩掉。# ipc_probe.py —— 核心采集模块资源包 scripts/ipc_probe.py import json from collections import defaultdict import psutil def _match_filter(pinfo, filters): 按 tag 配置过滤进程支持 process_name 与 cmdline 两种匹配。 for rule in filters or []: value pinfo.get(rule[match]) if value is None: continue if isinstance(value, list): value .join(value) if rule[value] in str(value): return True return False def collect_sockets(proc, kindinet): 枚举指定进程的 TCP/UDP 连接返回可序列化的列表。 rows [] try: conns proc.connections(kindkind) except (psutil.AccessDenied, psutil.NoSuchProcess): return rows for conn in conns: rows.append({ fd: conn.fd, local: f{conn.laddr.ip}:{conn.laddr.port} if conn.laddr else -, remote: f{conn.raddr.ip}:{conn.raddr.port} if conn.raddr else -, status: conn.status }) return rows def collect_process_snapshot(filtersNone, kindinet, collect_shmTrue): 生成一次 IPC 状态快照。返回值可直接 json.dump。 snapshot defaultdict(list) skipped 0 for proc in psutil.process_iter([pid, name, cmdline, username]): try: pinfo proc.info if filters and not _match_filter(pinfo, filters): continue record { pid: pinfo[pid], process_name: pinfo[name], username: pinfo[username], cmdline: .join(pinfo[cmdline] or []), sockets: collect_sockets(proc, kind), num_fds: proc.num_fds() if hasattr(proc, num_fds) else -1, num_handles: proc.num_handles() if hasattr(proc, num_handles) else -1 } snapshot[kind].append(record) except (psutil.NoSuchProcess, psutil.AccessDenied): skipped 1 snapshot[_meta] {skipped: skipped, kind: kind} return snapshotprocess_iter 传入字段列表配合 proc.info 读取效率比逐个创建 Process 对象高。collect_sockets 里的 kind 是连接类型参数inet 同时包含 TCP 和 UDP想只看其中一种可以传 tcp 或 udp。num_fds 在 Linux 上表示文件描述符数量num_handles 在 Windows 上表示句柄数量脚本里做了一个兼容处理取不到就记为 -1。这样同一份 JSON 在两种平台上都能解释。3.3 命令行整合与参数解析采集模块是一个库真正落地要靠命令行入口。main.py 做的事情很简单加载配置、执行采集、导出 JSON。# main.py —— 命令行入口资源包 scripts/main.py import argparse import json from ipc_probe import collect_process_snapshot def load_profile(path): with open(path, r, encodingutf-8) as f: return json.load(f) def save_json(data, path): with open(path, w, encodingutf-8) as f: json.dump(data, f, ensure_asciiFalse, indent2) if __name__ __main__: parser argparse.ArgumentParser(descriptionIPC 客户端巡检) parser.add_argument(--profile, defaultprofiles/ipc_default.json, help采集配置模板路径) parser.add_argument(--kind, defaultNone, choices[inet, tcp, udp, unix], help连接类型默认取配置里的 kind) parser.add_argument(--interval, typefloat, defaultNone, help轮询间隔单次快照时不用传) parser.add_argument(--export-json, defaultNone, help报告导出路径) args parser.parse_args() config load_profile(args.profile) probe config.get(probe, {}) kind args.kind or probe.get(kind, inet) filters config.get(filter, []) output args.export_json or probe.get(export_json, ./ipc_report.json) snapshot collect_process_snapshot(filtersfilters, kindkind) save_json(snapshot, output) print(f[IPC Client] snapshot saved - {output})命令行里的 --kind 优先级高于配置文件适合临时想看某一种连接类型时使用--export-json 用于指定本次报告位置比如排障时直接把报告写到临时目录。如果你只想要一次快照--interval 完全可以不传这个参数是留给定时巡检用的。3.4 从 JSON 到简易仪表盘JSON 报告适合程序处理但人眼直接看还是会累。资源包里附带了一个渲染脚本把 JSON 转成静态 HTML 表格浏览器打开就能看。# render_report.py —— 报告渲染JSON - 静态 HTML 表格 import json from html import escape def render(report_path: str, output_path: str ipc_report.html): with open(report_path, r, encodingutf-8) as f: data json.load(f) sections [] for kind, records in data.items(): if kind.startswith(_) or not records: continue header trthPID/thth进程名/thth用户名/ththSocket数/thth句柄/FD/th/tr trs [] for rec in records: trs.append( ftrtd{rec[pid]}/tdtd{escape(rec[process_name])}/td ftd{escape(rec[username])}/tdtd{len(rec[sockets])}/td ftd{rec[num_fds] if rec[num_fds] 0 else rec[num_handles]}/td/tr ) sections.append(fh3{escape(kind)}/h3table{header}{.join(trs)}/table) html_doc (htmlheadmeta charsetutf-8/headbody .join(sections) /body/html) with open(output_path, w, encodingutf-8) as f: f.write(html_doc) if __name__ __main__: render(ipc_report.json, ipc_report.html)为什么用 escape因为进程名和用户名可能包含尖括号、引号之类的字符直接拼进 HTML 会破坏页面结构甚至被浏览器当成脚本执行。生产环境跑这类巡检工具一定要把不可信字符串转义掉。渲染出来的 HTML 只是给人看的辅助产物真正的数据源还是 JSON。4. IPC 客户端避坑指南五个采样翻车现场工具再好用踩过的坑不写下来等于白踩。以下五个问题是我实际使用这套 IPC 客户端时遇到的每一条都是先看到现象再定位原因最后给出解决方式。4.1 进程名对不上多实例与包装进程干扰现象报告里显示的进程名和任务管理器里看到的不一样或者一个角色对应了多个进程名采集结果里 tag 归并不到一起去。原因同一套业务程序可能带不同参数启动进程名相同但 cmdline 不同还有些语言运行时会包装一层进程导致主程序名被覆盖。解决不要只依赖 process_name 匹配。资源包里的 filter 支持 cmdline 匹配实际使用时应优先用启动参数里的业务标识比如--modeloader。如果实在没有参数再退回 process_name并加上用户名缩小范围。4.2 权限不足导致采样成功率低现象脚本跑完某个关键进程完全没出现在报告里_meta.skipped 数值却很大。原因普通用户权限不够psutil 在读取其他用户进程的元数据或句柄表时抛 AccessDenied采集模块为了不中断整体流程把这个进程跳过了。解决先看_meta.skipped的数值。如果跳过量很大说明当前权限不够。Windows 上用管理员身份运行Linux 上用 sudo 或配置免密 sudo。采集系统进程时权限不足是常态脚本跳过并记录下来比直接崩溃更利于事后排查。4.3 Linux 与 Windows 统计口径不一致现象同一套业务在 Windows 上报告里的 Socket 连接数比 Linux 上多出一截数据对不上。原因Windows 的句柄表和 Linux 的 /proc 文件描述符表不是一一对应关系psutil 的 connections 在不同平台上返回的状态字段也有差异。解决对比跨平台数据时不要追求数字完全相等要看相对变化。资源包的 JSON 报告里带上了_meta我习惯在导出时额外加一个 platform 字段标记来源系统。趋势分析只跟同平台的历史数据比跨平台直接对比会得出错误结论。4.4 JSON 导出乱码现象Windows 上用 Excel 打开导出的 JSON中文显示成乱码程序再次读取时也报编码错误。原因Python 的 open() 在 Windows 上默认使用系统编码写文件导出的不是 UTF-8。资源包里所有读写文件的代码显式指定了 encodingutf-8但你自己写的补充脚本很容易漏掉。解决所有涉及文件读写的地方统一加上encodingutf-8json.dump 时再加一个ensure_asciiFalse。这样中文会以原字符写入文件避免转义。4.5 轮询过快导致“假空闲”现象定时巡检跑了一个小时报告里消息队列积压量始终是 0但业务确实卡顿过几次。原因采集间隔小于业务处理周期。队列在两次采样之间膨胀又清空每次采样都恰好落在空闲期形成了一个假象IPC 通道一切正常。解决把--interval调到 10 秒以上至少覆盖一轮完整的生产-消费周期。同时不要只采当前队列长度把 TCP 连接状态也加进来比如 TIME_WAIT 数量陡增往往比队列长度更早暴露问题。5. 把 IPC 客户端用出深度定时巡检、阈值告警与趋势导出单次快照只能证明“这一刻没炸”跨进程通信问题往往是慢慢劣化的。我会用资源包里附带的一个小脚本把 IPC 客户端从“手工排查工具”升级成“定时巡检工具”。# ipc_watch.py —— 定时采样按间隔循环采集并保留分片报告 import argparse import json import time from pathlib import Path from datetime import datetime from ipc_probe import collect_process_snapshot def run_watch(profile_path, kind, interval, times, output_dir): config json.loads(Path(profile_path).read_text(encodingutf-8)) filters config.get(filter, []) Path(output_dir).mkdir(parentsTrue, exist_okTrue) i 0 while times 0 or i times: snap collect_process_snapshot(filtersfilters, kindkind) stamp datetime.now().strftime(%Y%m%d_%H%M%S) out Path(output_dir) / fipc_{stamp}.json out.write_text(json.dumps(snap, ensure_asciiFalse, indent2), encodingutf-8) print(f[{i 1}] {out}) i 1 if times 0 and i times: break time.sleep(interval)跑法很简单python ipc_watch.py --profile profiles/ipc_default.json --kind tcp --interval 10 --times 60每 10 秒拍一次连拍 60 次。关键点在间隔设置上间隔要大于业务进程最短通信周期的一半太密只是浪费 IO太稀会错过峰值。分片 JSON 留下一份过程数据后续怎么分析都有后悔药。拿到分片报告之后我会再做一次合并和阈值判断。合并逻辑是按时间线抽出每个 tag 的 Socket 数和句柄数输出成 CSV方便导入表格工具画趋势曲线。# merge_reports.py —— 合并分片报告输出 CSV 并做简易告警 import csv import json from pathlib import Path def merge_and_alert(report_dirreports, output_csvipc_trend.csv): rows [] for path in sorted(Path(report_dir).glob(ipc_*.json)): data json.loads(path.read_text(encodingutf-8)) for kind, records in data.items(): if kind.startswith(_): continue for rec in records: fd rec[num_fds] if rec[num_fds] 0 else rec[num_handles] socket_count len(rec[sockets]) if socket_count 500 or fd 4096: print(f[ALERT] {path.stem} {rec[process_name]} fsockets{socket_count} fd{fd}) rows.append({ time: path.stem, pid: rec[pid], process_name: rec[process_name], sockets: socket_count, fd: fd }) with open(output_csv, w, newline, encodingutf-8) as f: writer csv.DictWriter(f, fieldnamesrows[0].keys()) writer.writeheader() writer.writerows(rows)阈值 500 和 4096 是经验值不同业务差异很大。Socket 数突然突破历史均值的一倍或者句柄数逼近系统上限就该告警了。从那以后我每次给模块加跨进程接口都会先把这套 IPC 客户端跑一遍基准拿到正常数据之后再做改动改完再跑一遍对比曲线确认没有劣化。希望你也能拿着这套工具把下一次跨进程通信的“玄学”问题变成看得见的数字希望帮到你。本文还有配套的精品资源点击获取

相关新闻

从MATLAB xcorr到C语言重写:互相关实现中的lag轴、归一化与FFT加速

从MATLAB xcorr到C语言重写:互相关实现中的lag轴、归一化与FFT加速

简介:这份资源面向信号处理学习者与嵌入式开发者,提供用C语言复现MATLAB中xcorr互相关函数的完整实现,帮助在资源受限或追求高性能的场景下摆脱对MATLAB运行环境的依赖。压缩包共2个文件,包含1个c源文件与1个h头文件,体…

2026/10/16 12:51:44 阅读更多 →
Webots仿真机器人课程设计案例:从避障到无人机导航实战解析

Webots仿真机器人课程设计案例:从避障到无人机导航实战解析

简介:压缩包集合了Webots机器人仿真的典型实践案例,面向机器人相关专业学生、科研人员与仿真爱好者,可用于学习运动控制、步态规划、传感器应用与基础控制算法。资源共121个文件,以C语言源码、构建脚本、仿真工程场景、演示视频及…

2026/10/16 12:51:44 阅读更多 →
NHANES-A:面向公共卫生研究的NHANES数据预处理框架

NHANES-A:面向公共卫生研究的NHANES数据预处理框架

简介:nhanesA 是一个面向R语言数据分析初学者与公共卫生研究者的NHANES数据获取与探索专用工具包,旨在降低国家健康与营养检查调查(NHANES)原始数据的检索门槛,解决多轮次、多模块、高维度健康数据难以快速定位与导入的…

2026/10/16 12:51:44 阅读更多 →

最新新闻

Java老兵AI Agent转型实战:无需Python的工程化落地指南

Java老兵AI Agent转型实战:无需Python的工程化落地指南

1. 一个Java老兵的AI Agent转型之路1.1 为什么我决定从Java转向AI Agent写了十三年代码,Spring全家桶闭着眼睛都能搭出一套微服务架构,JVM调优参数比自家WiFi密码还熟。但去年开始,身边越来越多项目开始提“智能体”“Agent”“自动化决策”这…

2026/10/16 13:26:52 阅读更多 →
17个Deeplink动作速查表:用Shortcuts、Alfred和Raycast一句话控制Itsyhome

17个Deeplink动作速查表:用Shortcuts、Alfred和Raycast一句话控制Itsyhome

【免费下载链接】itsyhome-macos A native macOS menu bar app for controlling your smart home devices. 项目地址: https://gitcode.com/gh_mirrors/it/itsyhome-macos 点击查看 免费下载 Itsyhome 是一款原生的 macOS 菜单栏智能家居 App,支持控制 …

2026/10/16 13:26:52 阅读更多 →
Spring AI扩展包停更不用慌:Java开发者的大模型迁移与破局

Spring AI扩展包停更不用慌:Java开发者的大模型迁移与破局

前阵子社区里都在议论某个国产 Spring AI 扩展包停更的事,说实话,刚看到这个消息的时候我也愣了一下。这个扩展包一度被看作 Java 接入大模型最顺手的路径之一:依赖一引、配置一写,就能把对话补全、向量检索、工具调用接到 Spring…

2026/10/16 13:26:52 阅读更多 →
mingw32 gcc 2.95 旧工具链实战:环境搭建与兼容性避坑指南

mingw32 gcc 2.95 旧工具链实战:环境搭建与兼容性避坑指南

简介:一套专为Windows平台设计的轻量级开源GNU工具集,即MingW32 2.95,面向需要在Windows下编译本地C/C程序的开发者,可调用Windows API直接构建命令行或图形应用。该版本以精简和稳定著称,适合配置老旧开发环境、维护历…

2026/10/16 13:26:52 阅读更多 →
SpringBoot+Vue林业产品推荐系统:从推荐算法到前后端部署全解析

SpringBoot+Vue林业产品推荐系统:从推荐算法到前后端部署全解析

做毕业设计或课程设计的同学,选“SpringBootVue”这套组合的非常多,但要真正落地一个“林业产品推荐系统管理平台”这种带垂直场景的项目,光会CRUD是不够的。标题里这几样东西——Java、MySQL、前后端分离、推荐系统,再加一个林业…

2026/10/16 13:26:52 阅读更多 →
Agent上下文压缩与记忆策略指南:守住Token成本,告别对话失忆

Agent上下文压缩与记忆策略指南:守住Token成本,告别对话失忆

做Agent应用的时间越久,越会发现一个真相:真正卡住Agent上限的往往不是模型能力,而是上下文窗口。我见过太多这样的场景——一个看起来逻辑很完整的多工具Agent,跑到第8轮调用时就开始“失忆”,把用户几分钟前明确提到…

2026/10/16 13:25:49 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

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

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/15 9:49:14 阅读更多 →