---
description: "阅读视频的维护记录：video_read.py 从视频笔记的关键帧脚本和转写代码拆出来，补了静音检测、图文拼图、按张数定行列；2026-10-17 实测 B 站、小红书、抖音和单个视频文件的耗时与花费；用脚本不用看，出问题再看"
---

# 阅读视频的维护记录

这是[阅读视频](../skills/agent-io/reference/read-video.md)背后的维护记录。用脚本时不用看，出问题或者要改做法时再看。

## 从哪来 { #upstream }

- 2026-10-17 用户定下「视频笔记拆成下载、分析、输出，下载和分析归 agent-io」，`video_read.py` 就是分析这一段
- 选帧、抽帧、联系图照搬视频笔记的 `extract_video_keyframes.py`：每P中间先取一帧，其余按总时长均匀撒；`-ss` 放 `-i` 前面；竖屏用竖格子
- 转写照搬视频笔记 `agent_io.py` 里的那套：抽 16 kHz 单声道 32 kbps mp3，10 分钟一块，`verbose_json` 加词级时间戳和 `diarization`，一个人讲的整块只回一个 segment，按词级时间戳和标点重新切成字幕行
- 输入换成[解析分享链接](../skills/agent-io/reference/share-link/index.md)的文件夹，读 `meta.json` 的 `parts`，不再自己下视频；也收单个视频文件

## 这次补的 { #added }

- **静音不送转写**：三轮新 agent 都自己用 `volumedetect` 判断有没有声音。静音音轨照样计费、转回来是空的，所以最大音量低于 -50 dB 就跳过
- **图文拼图**：三轮 agent 都自己拼过多图。其中一轮用图片序列直接接 `tile`，碰到尺寸不同的图悄悄截断，第一次拼出来的图不全；脚本先把每张缩放补边到 300×400 的格子，再拼，左上角标序号
- **按张数定行列**：不满 12 张的拼图原来照样是 4×3，最后一张只有 1 张图时大半是空白；改成张数少就少几行、少几列
- **短视频按画面切换取帧**：分析段验收时，抖音那条 46 秒教程把三段提示词全屏放在 6–9 秒，均匀撒的 12 帧落在 5.3 秒和 9.7 秒，正好漏掉；口播每分钟 394 字，按字数也报不了警。改成 3 分钟以内按画面切换取：提示词卡那次切换的分数是 1.0，全片最高。第一版取在切换后 0.4 秒，卡片是逐字打出来的，只拍到一半；改成取在下一个切换之前，三段拍全
- **单帧不缩小**：原来单帧缩到 540 宽再补边，2160×2880 的录屏界面字读不了；改成长边最多 1920，只有拼联系图时才缩
- **重复帧**：原来先在每P中间取一帧、再均匀撒，单P视频两种取法撞在同一时刻，12 格只有 11 张不同的图；改成先均匀撒，再给没分到的P补一帧
- **补空档、手动补帧**：端到端验收时，同一条抖音 17–28 秒是录屏里 Agent 对话慢慢滚动，没有一处画面切换，一帧都没取到，验收的 agent 只好自己用 ffmpeg 补抽，补的帧进不了证据索引。改成超过 6 秒没切换就每 4 秒补一帧；另加 `--at` 按时间点补帧，补的帧进 `keyframes.json`。原来 `--force` 连转写一起重做、重新扣钱，拆成 `--force` 只重做取帧、`--retranscribe` 才重新转写
- **临时文件**：原来用系统临时目录，本机根分区满了；改成写在输出文件夹里
- **每分钟字数**：3 分钟以上的视频每分钟不到 80 字时提醒内容在画面上；阈值是自己定的，视频笔记原来按字幕密度算画面依赖，这里只留一句提醒

## 实测 { #tests }

2026-10-17，输入是解析分享链接刚取下的文件夹：

| 输入 | 结果 |
|---|---|
| B 站单P 31 秒、2P 公测 PV、小红书 37 秒真视频、抖音 45 秒，一次跑完 | 都成功，64 秒；4 条都没有字幕，都转写了，共 0.0105 美元；小红书那条是纯音乐，转写为空，有提示 |
| 小红书 4 张图的图文、B 站 25 张图的图文 | 分别拼成 1 张、3 张，序号对得上 |
| 单个视频文件（小红书那条静音录屏） | 写进 `dsh_read/`；最大音量 -91 dB，没送转写 |
| `--frames 5` | 联系图 4 列 2 行 |
| 修完后：抖音 46 秒教程 | 按画面切换取 13 帧，第 5 帧在 8.667 秒，三段提示词完整；单帧 1440×1920 |
| 修完后：B 站 2P 公测 PV，262 秒 | 均匀撒 12 帧，每P 6 帧，没有重复的时间点 |
| 补空档后：同一条抖音 | 17 帧，17–28 秒补了 20.6、24.2 秒两帧，33–41 秒补了两帧；`--at 19,25.5` 再补两帧，转写没重做，花费 0 |

## 没做的 { #not-done }

- 没有 OCR：联系图和单帧交给能看图的模型，模型看不了图就只能读转写
- 长视频没实测：50 分钟的课这次只取了元数据，没下视频、没转写
- 帧是按时间均匀取的，不是按画面切换取的；PPT 类视频可能漏页
