# 不考虑速度时，怎么把「画面最好 + 体积最小」同时做到极限

- 日期：2026-09-19
- 前提：愿意用几小时到几十小时换一部片子，只关心**画质**和**体积**
- 结论：**SVT-AV1 软件编码，preset 4（珍藏片 preset 2），crf 21，`enable-tf=0` + `tune=0`，输出 10-bit**
- 一句话：速度可以不要，但**编码器效率**和**时域滤波开关**这两件事不能将就

---

## 一、先分清「最好」的三种含义

问「画面最好 + 文件最小用什么」，其实混了三个目标。必须拆开：

| 目标 | 含义 | 决定因素 |
|---|---|---|
| 画质最好 | 同体积下最接近原片 | 编码器效率 + preset 慢档 + 关掉 TF |
| 体积最小 | 同画质下最小 | 同上，**外加 CRF 定多高** |
| 二者兼顾 | **这是不可能的三角** | 只能「固定画质、体积随编码器效率走」 |

**关键认知**：`画质` 和 `体积` 不是两个可以同时优化的独立变量。
正确做法是**先钉死画质靶点（CRF），让体积成为结果**；能同时改善两者的只有「换更高效的编码器」和「用更慢的 RD 优化」。

### ⚠ 更重要的物理前提

**重编码不可能让「已经压得很紧」的源片同时变小又变好** —— 那是代际损失。
只有源码**编码效率低 / 码率虚高**时，AV1 才能做到「画质不降、体积砍一半」。

判定标准（用每像素比特数 bpp）：

```
bpp = 码率(bps) / (宽 × 高 × 帧率)
```

| 源码 bpp | 判断 | 该怎么办 |
|---|---|---|
| **> 0.12** | 明显虚高（老 H.264 高清、高码率 HEVC） | AV1 能省 40~60%，画质还能持平或更好 |
| 0.06 ~ 0.12 | 中等 | 能省 20~40%，需实测 |
| **< 0.05** | 已经压得很紧 | **别转**，重编只会掉画质。这种情况「画质最好」= 保留原片 |

举例：`[HD]ADN-027.avi`（720p，7043 秒，1.69GB）≈ **2.06 Mbps，bpp≈0.075** —— 属于「中等偏紧」。
这就是上次 crf 33 一压就糊的原因：源本身余量已经不多，再砍 73% 必然崩。

---

## 二、方案（画质优先档）

### 核心命令

```bash
ffmpeg -hide_banner -nostdin -i "输入.mkv" \
  -map 0:v:0 -map "0:a:0?" -c:a copy -sn \
  -c:v libsvtav1 -preset 4 -crf 21 \
  -pix_fmt yuv420p10le \
  -svtav1-params "enable-tf=0:tune=0:lp=16" -threads 16 \
  -movflags +faststart "输出.mp4"
```

已封进脚本，一条命令即可：

```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 --min-size 2000
```

### 每个参数为什么是它

| 参数 | 值 | 理由 |
|---|---|---|
| 编码器 | `libsvtav1` | 免费软件 AV1 里效率最高、工程最成熟的一档。HEVC(x265) 同画质体积大 15~25%，H.264 更大 |
| `-preset` | **4**（珍档 2） | preset 越慢 → 同画质体积越小。12→4 每档约省 8~12%，累计约省 30%。**这就是「不要速度」换来的东西** |
| `-crf` | **21**（18~22 区间） | 1080p 真人实拍 crf 21 基本视觉无损。老片/颗粒片 18~19，动画/干净源可到 24 |
| `enable-tf=0` | **必须** | SVT-AV1 默认的时域滤波会产生**块状伪影 + 运动拖影**，这就是上次翻车的主因之一 |
| `tune=0` | **VQ** | **SVT-AV1 默认 tune 是 PSNR（数值最优化），不是视觉最优**。改 VQ 后按人眼偏好分配码率 —— 这条此前一直没开，白亏 |
| `-pix_fmt yuv420p10le` | 10-bit | 8-bit 源也编成 10-bit：同画质**省 2~5% 码率**，还能消除暗部 banding。**免费收益**，播放兼容性没问题 |
| `-c:a copy` | 音频直拷 | 重编音频只会更差更大，直接复制 |
| `-movflags +faststart` | moov 前置 | 网页预览秒开（我们的下载平台正好吃这个） |

### ✅ 本机实测过的参数可用性（SVT-AV1 **v1.7.0**）

不是所有教程里的参数在 v1.7.0 上都存在。逐条实测结果：

| 可用 ✅ | 不可用 ❌（较新版本才有） |
|---|---|
| `enable-tf=0`、`tune=0/2`、`film-grain=8`、`film-grain-denoise=1`、`enable-restoration=1`、`enable-cdef=1`、`enable-dlf=1`、`keyint`、`scd`、`enable-tpl-la`、`enable-mfmv`、`enable-overlays`、`hierarchical-levels`、`pred-struct`、`fast-decode` | `enable-variance-boost`、`variance-boost-strength`、`qp-max`、`qp-min`、`sharpness`、`ac-bias`、`enable-dlf=2/3`、`enable-restoration-filtering` |

**⚠ 坑：写错的 `svtav1-params` 不会中断编码**，只在日志里留一行 `Error parsing option xxx`，然后**静默按默认值跑**。
所以别抄网上的参数清单 —— 每加一条都要用 1 秒黑场试编验证（脚本里我只放了实测通过的那几个）。

**别画蛇添足**：`enable-restoration` / `cdef` / `dlf` 在 preset 4 上本来就是默认开启的，写不写一样。

---

## 三、为什么不选别的

| 方案 | 为什么不选 |
|---|---|
| `av1_nvenc`（5060 Ti 硬编） | **速度档**。默认参数下能打赢「默认参数的软编」，但软编一旦 `enable-tf=0` + preset 4，硬编的非关键帧质量仍追不上。既然不要速度，就没理由用硬编 |
| `libaom-av1 -cpu-used 2` | 本机 ffmpeg 就有。极慢档**理论上比 SVT 再省 1~3%**，但慢 5~10 倍。为 1% 体积多花几天，性价比极低，**不推荐** |
| `libx265`（HEVC 软编） | 只在播放设备不支持 AV1 时用。同画质体积比 AV1 大 15~25% |
| `librav1e` | 效率不如 SVT-AV1，无优势 |

---

## 四、可选杀手锏：胶片颗粒重的老片

如果源是**颗粒感很重的老片/胶片转制**，把颗粒交给解码器「合成」而不是逐帧编码，体积能再砍 30~50%：

```bash
--svt-params "enable-tf=0:tune=0:film-grain=8:film-grain-denoise=1"
```

- 原理：编码前把颗粒抹掉（省大量码率），播放时按 `film-grain` 强度**重新合成**颗粒
- 代价：颗粒是「造」出来的，不是原片的。**属于有损重建，不算严格意义上的画质无损**
- 建议：只在颗粒确实很重的片上试，且必须眼睛验收

---

## 五、验收方法（上次的教训）

**SSIM 抓不到拖影** —— 上次 SSIM 0.9817 明明过线，画面却是糊的。

| 手段 | 可用性 | 说明 |
|---|---|---|
| `ssim` / `psnr` 滤镜 | ✅ 本机有 | 只能挡住「明显劣化」，**不能作为放行依据** |
| `libvmaf`（VMAF） | ❌ 本机 ffmpeg 没编进去 | 需要另装；即使有，VMAF 对拖影也不够敏感 |
| `vmafmotion` 滤镜 | ✅ 本机有 | 能测运动复杂度，用来**挑运动最剧烈的片段**做抽样 |
| **肉眼并排对比** | ✅ **最终依据** | 抽 3~5 个**运动剧烈**的 10 秒片段，同屏放大对比，看拖影/涂抹/暗部色块 |

脚本里的 `--ssim-min 0.995`（archive 模式自动提高）+ 抽样机制是**兜底防线，不是验收**。最终要眼睛过。

---

## 六、速度预算（估算，实跑要校准）

参照本机实测（i7-4720HQ，4 线程）：preset 12 = 0.91× 实时，preset 10 = 0.48×，preset 8 = 0.28×（约每档慢 1.34 倍）。

| 机器 | preset 4（1080p） | 一部 2 小时片子 |
|---|---|---|
| 本机 DSH（4c/8t Haswell） | ≈ 0.09× 实时 | ≈ **23 小时** |
| **GPU 机（i5-12600HX，16 线程）** | ≈ 0.35~0.45× 实时 | ≈ **4.5~6 小时** |

- **4K 片源按 4 倍时间算**（像素是 1080p 的 4 倍）
- preset 2 再慢约 1.8 倍
- 当前清单 38 个文件 / 46.84 GB，含 4K 大文件 → **整库按天算**，必须挂夜里/后台跑

---

## 七、执行计划（GPU 机）

**当前状态（2026-09-19 20:48 实测）：GPU 机正忙 —— GPU 利用率 100%、显存 15.5/16.3 GB（ComfyUI 进程 pid 3018），不能动。**

已探明的资源情况：

| 项 | 值 |
|---|---|
| CPU | **i5-12600HX**（12 核 16 线程，12 代）→ 比本机快约 4~5 倍 |
| 内存 | 32 GB（可用 16 GB） |
| 磁盘 | `/` 1.2 T，**只剩 200 G** → 并发度要控制，别一次拉太多源 |
| ffmpeg | 6.1.1，SVT-AV1 **v1.7.0**（和本机同版本，参数可用性结论通用） |

**流程**（等它空闲后执行）：
1. 从下载中心 HTTP 拉源片到 GPU 机临时目录；
2. 先跑 **60 秒样本**定 CRF（对比 crf 19/21/24，肉眼挑），别整片盲跑；
3. 按定下的 CRF 整片 `--archive` 编码；
4. 校验时长一致 + 运动片段肉眼对比；
5. 成品传回本机，替换前先在 `~/.av1-slim/backup.tsv` 记好回滚备份。

---

## 八、结论速查

| 想要 | 用什么 |
|---|---|
| **画质与体积的最优解（不看速度）** | `libsvtav1 -preset 4 -crf 21 -pix_fmt yuv420p10le -svtav1-params "enable-tf=0:tune=0"` |
| 少数最值得的片子 | preset 2 / crf 19 |
| 颗粒重的老片 | 上面 + `film-grain=8:film-grain-denoise=1`（有代价） |
| 已压紧的低码率源（bpp<0.05） | **别转**，保留原片就是画质最优 |
| 全库批量（要速度） | 见 `2026-09-19-50系显卡编码选择-实测与建议.md` 的 `av1_nvenc` 档 |

---

## 九、已知限制（脚本层面，需要时再补）

1. **字幕流会被丢弃**：编码行是 `-map 0:v:0 -map 0:a:0? -sn`，只保留第一条视频 + 第一条音轨，字幕和其他音轨不保留。需要保留的话要单独做（文本字幕可转 `mov_text`，PGS 图形字幕要另想办法），说一声我来加。
2. **输出固定 `.mp4`**：源是 `.avi/.mkv` 时文件名会改成 `.mp4`，回滚记录里有对应关系。
3. **预估省的比例是经验值**（按 CRF 粗算），真实结果取决于源码率，仅供规划磁盘用。

---

## 十、相关文档

- `2026-09-19-50系显卡编码选择-实测与建议.md` —— 要速度时用 `av1_nvenc` 的那一档
- `AV1瘦身脚本-使用说明.md` —— 脚本全部参数
- `AV1瘦身记录.md` —— 历次实跑结果与回滚记录
