# AV1 批量瘦身脚本 使用说明

- 脚本：`~/Downloads/av1-slim.sh`（可执行）
- 作用：把**迅雷下载**里的视频用 **AV1(SVT-AV1)** 重编码，体积约降到 **1/2~1/3**，校验通过后原子替换，原文件保留在隐藏备份目录可一键回滚
- 日期：2026-09-19 首次上线并实测通过；同日按用户反馈修默认参数并新增 `--archive` 画质优先模式

> ⚠ 必读 1：**已实测你的浏览器能直接播 AV1**（`编码兼容测试/3-AV1-看能否播放.mp4` 可播），所以瘦身后仍可在下载中心在线预览。
>
> ⚠ 必读 2：**默认参数已从 `crf 33 / preset 12` 改为 `crf 28 / preset 10`**。原因：crf 33 在低码率源（720p/2Mbps 这类）上会把码率砍 73%，出现**肉眼可见的模糊与运动拖影**（SSIM 0.9817 虽过线，但 SSIM 对拖影不敏感）。同时脚本编码行已内置 **`enable-tf=0`** —— SVT-AV1 默认的时域滤波正是拖影与块状伪影的来源。
>
> ⚠ 必读 3：**写错的 `svtav1-params` 不会报错中断**，只在日志留一行 `Error parsing option` 然后按默认值跑。别照抄网上参数表，每加一条都要验证（本机 SVT-AV1 v1.7.0 的可用参数清单见 `2026-09-19-画质优先-AV1极限压缩方案.md`）。

---

## 零、什么时候用哪个模式

| 场景 | 用哪个 | 说明 |
|---|---|---|
| 日常批量瘦身 | **默认模式**（`crf 28 / preset 10`） | 速度与体积平衡，一晚能啃一批 |
| **只在乎画面和体积、不在乎速度** | **`--archive`** | `preset 4 / crf 21 / tune=VQ / 10bit`，一部 2 小时片子 4.5~6 小时（GPU 机） |
| 已经压得很紧的源（bpp<0.05） | 别转 | 重编只会掉画质，保留原片才是画质最优 |

**`--archive` 画质优先模式**（2026-09-19 新增）：

```bash
bash ~/Downloads/av1-slim.sh --archive --threads 16 --dry-run   # 先看清单与预估
bash ~/Downloads/av1-slim.sh --archive --threads 16             # 正式跑（很慢）
bash ~/Downloads/av1-slim.sh --archive --preset 2 --crf 19      # 珍藏片再慢一档
bash ~/Downloads/av1-slim.sh --archive --svt-params "enable-tf=0:tune=0:film-grain=8:film-grain-denoise=1"   # 颗粒重的老片
```

archive 模式自动做的事：`preset=4`、`crf=21`、`tune=0`(VQ 视觉调优)、`-pix_fmt yuv420p10le`（8-bit 源也编 10-bit，同画质省 2~5% 且消 banding）、`SSIM_MIN` 提到 0.995。单独给 `--preset` / `--crf` 可覆盖（`--archive` 放在前面即可）。
参数选择依据与实测数据：`2026-09-19-画质优先-AV1极限压缩方案.md`。

---

## 一、实测效果（真实素材）

| 素材 | 原体积 | AV1 后 | 省 | 抽样 SSIM |
|---|---|---|---|---|
| 迅雷下载 60 秒 1080p 片段 | 45.96 MB | 11.54 MB | **75%** | 0.9916 |
| 同上（新默认 preset 12） | 24.77 MB | 6.95 MB | **72%** | 0.9912 |

脚本完整流程（转码→时长校验→抽样 SSIM→省幅校验→原子替换→写备份与报告）已在沙盒中端到端验证，含**回滚测试**通过。

## 二、preset 怎么选（本机实测：60 秒 1080p，crf 33，4 线程 + nice 19）

| preset | 耗时 | 速度 | 省幅 | SSIM | 40 个候选（44.6 小时内容）预计 | 每晚 6 小时需 |
|---|---|---|---|---|---|---|
| **12（默认）** | 66s | **0.91x 实时** | 74% | 0.9901 | **约 49 小时** | **约 8 晚** |
| 10 | 124s | 0.48x | 75% | 0.9910 | 约 93 小时 | 约 16 晚 |
| 8 | 213s | 0.28x | 75% | 0.9916 | 约 159 小时 | 约 27 晚 |

**结论：preset 12 性价比最高** —— 比 preset 8 快 3.2 倍，省幅只差 1 个百分点。
> ⚠ 上表是 **crf 33 时代的实测数据，只用来比较 preset 之间的相对速度**，省幅一列不可照搬（crf 33 已被判定画质不可接受）。
> 现行默认是 `crf 28 / preset 10`；画质优先是 `--archive`（`preset 4 / crf 21`）。

## 三、命令速查

```bash
# 1) 先看要处理哪些、能省多少（不改动任何文件）
bash ~/Downloads/av1-slim.sh --dry-run

# 2) 先试 1 个（最稳的起步方式）
bash ~/Downloads/av1-slim.sh --limit 1

# 3) 夜间批处理：跑到早上 7 点自动停
bash ~/Downloads/av1-slim.sh --until 07:00 --yes

# 4) 或者限制本次最多跑 3 小时 / 最多 5 个文件
bash ~/Downloads/av1-slim.sh --max-hours 3 --limit 5 --yes

# 5) 看进度与累计成果
bash ~/Downloads/av1-slim.sh --status

# 6) 看可回滚的备份 / 回滚
bash ~/Downloads/av1-slim.sh --list-backups
bash ~/Downloads/av1-slim.sh --rollback-all          # 全部回滚
bash ~/Downloads/av1-slim.sh --rollback "/完整/路径.mp4"   # 回滚单个

# 7) 清理 7 天前的备份（释放空间）
bash ~/Downloads/av1-slim.sh --purge-backups 7
```

常用参数：`--dir`（默认只处理 `/home/zyw/Downloads/xunlei-downloads`）、`--min-size MB`（默认 300）、`--crf`（默认 33）、`--preset`（默认 12）、`--threads`（默认 4）、`--min-save`（默认 15，省不到就跳过）、`--ssim-min`（默认 0.980）。

## 四、每晚自动跑（可选，需要你自己启用）

```bash
# 加到 crontab（crontab -e）：每晚 01:00 开始，跑到 07:00 自动停
0 1 * * * /bin/bash /home/zyw/Downloads/av1-slim.sh --until 07:00 --yes >> /home/zyw/.av1-slim/cron.log 2>&1
```
脚本带 flock 锁，即便上一次没跑完也不会并发；已完成的文件会跳过，**天然断点续传**。

## 五、安全机制（为什么可以放心跑）

1. **三关校验**，任一不过就保留原文件：时长一致（±1 秒或 0.5%）、抽样 SSIM ≥ 阈值（默认 0.980，抽 3 段）、省幅 ≥ 阈值（默认 15%）。
2. **原子替换**：新文件先写成同目录隐藏临时文件（列表页不会显示），校验通过才 `mv` 就位。
3. **原文件备份**：移到 `~/Downloads/.av1-slim-backup/`（同一文件系统，瞬间完成），保留到 `--purge-backups` 清理；`--rollback-all` 可一键恢复。
4. **跳过规则**：已经是 AV1 的、码率已经很紧的（bpp<0.045）、小于 `--min-size` 的、预计省不到 15% 的，都不会白转。
5. **资源控制**：`nice -n 19` 降优先级、线程数可限（默认 4/8 线程）、`--until`/`--max-hours` 限时、每个文件前检查剩余空间（需 ≥ 预估产出 + 3GB）。
6. **中断安全**：Ctrl-C 会停止当前转码并清理临时文件，原文件不动；下次运行自动接着来。

## 六、注意事项

- **笔记本平台**：长时间满负荷编码会发热降频，建议用 `--until 07:00` 夜间跑，别白天和别的重活抢 CPU（跑 ComfyUI/大模型时尤其别跑）。
- **多音轨只保留第一条**；字幕会被丢弃（要保留字幕请告诉我，可以改成 `-c:s mov_text`）。
- **HDR/10bit 源**：脚本会自动按源位深输出（10bit → `yuv420p10le`），不会压成 8bit。
- 已确认的现状：迅雷下载里 **>300MB 的视频共 40 个 / 58.6 GB / 内容 44.6 小时**，按默认参数全跑完约省 **约 30 GB**（磁盘当前可用 168 GB，不是急需，可按节奏慢慢来）。

## 六之二、首个真实文件实测（2026-09-19，preset 12 / crf 33）

**`[HD]ADN-027.avi`（1280×720, h264+mp3, 1 小时 57 分, 1.69 GB）**

| 指标 | 结果 |
|---|---|
| 新体积 | **519 MB**（省 **1.18 GB / 70%**） |
| 耗时 | 60 分 31 秒 → 约 **1.95 倍实时** |
| 时长校验 | 7043.108571s ↔ 7043.069367s（差 0.04 秒）✓ |
| 抽样 SSIM | **0.98166**（阈值 0.98）✓ |
| 编码 | h264 2.06 Mbps → **av1 0.56 Mbps**，音频 mp3 直拷（无二次损失）|
| 文件名 | 自动由 `.avi` 改为 **`.mp4`**（容器变了就必须改名，否则平台会按 AVI 再转一次码） |

**额外收益**：原 AVI 在下载中心点预览要**先服务端转码 30~60 分钟**；现在是 AV1/MP4，**浏览器原生秒开**（已验证预览走原生 `<video>` 路径）。顺手清掉了旧 AVI 遗留的 1.72 GB 转码缓存。

**crf 档位参考**（同素材 30 秒样本，preset 12；全片外推体积仅供参考）

| crf | 样本省幅 | SSIM | 全片外推 |
|---|---|---|---|
| 28 | 77% | 0.9881 | ~403 MB |
| 30 | 80% | 0.9879 | ~354 MB |
| **33（默认）** | 84% | 0.9876 | ~282 MB（实测 519 MB，样本段偏简单）|
| 36 | 87% | 0.9871 | ~229 MB |

> SSIM 在高 crf 区趋于饱和，肉眼差别要看运动场景；想更保守就用 `--crf 30`。

## 六之三、整库时间预算（按首个文件实测速度）

内容 44.6 小时，720p 实测 1.95 倍实时；1080p/4K 会慢些（约 0.9~1.3 倍实时）。
综合估计整库需 **约 24~45 小时纯编码** → 每晚跑 6 小时约 **4~8 个夜晚**，总省 **约 28~30 GB**。

## 七、日志与状态文件

| 文件 | 用途 |
|---|---|
| `~/.av1-slim/state.tsv` | 每个文件的处理状态（done/skip/fail/rolledback） |
| `~/.av1-slim/backup.tsv` | 备份索引（原路径 ↔ 备份路径） |
| `~/.av1-slim/run.log` | 运行日志（带时间戳） |
| `~/Downloads/.av1-slim-backup/` | 原文件备份（回滚用） |
| `dl-hub/05-下载服务维护/AV1瘦身记录.md` | 结果报告（每次运行后自动更新，含下载页链接） |
