老视频满屏横纹/梳齿状?彻底搞懂去隔行(Deinterlace)与画质修复全攻略
从电视录制的老视频、老 DV 摄像机拍的素材、或者某些监控录像,在电脑上播放时经常出现"密集横向纹理""人物边缘梳齿状抖动""一动起来就糊成一片"——这叫隔行扫描(interlaced)伪影。这篇文章讲清楚隔行是什么、为什么要转逐行、以及用 ffmpeg 的 yadif / bwdif 等滤镜怎么修,并对比不同滤镜质量与代价,附降噪组合、批量脚本和常见翻车。
一、什么是隔行扫描
老式 CRT 电视为省带宽,把一帧拆成"奇数行"和"偶数行"两场(field)交替显示。静止画面看着正常,但一旦有运动,两场捕捉的不是同一时刻,叠在一起就出现横纹/梳齿。现代显示器是逐行(progressive)的,直接显示隔行内容就会露馅——尤其运动画面最明显。
判断口诀:静止时正常、一运动就"梳齿/横纹/拉丝",八成是隔行。
二、先确认是不是隔行
用 ffprobe 看:
ffprobe -v error -select_streams v:0 -show_entries stream=field_order -of csv=p=0 input.m4v
tt/tb/bt/bb表示隔行(不同扫描顺序);progressive表示已逐行;- 也可肉眼:放大静止帧看有无横纹理、运动时有无梳齿。
有时 field_order 字段为空(编码器没写),那就靠肉眼或试处理对比。
三、去隔行:yadif 滤镜
最常用 yadif(Yet Another DeInterlacing Filter):
# 输出逐行,每场变一帧(帧数翻倍,运动更顺)
ffmpeg -i input.m4v -vf "yadif=1" -c:a copy output.mp4
yadif=0:每帧输出一帧(默认,丢一半场,文件小);yadif=1:每场输出一帧(帧率翻倍,运动更顺但文件更大);yadif=2/3:类似但用空间插值,边缘更平滑。
四、更高质量的去隔行:bwdif
bwdif(Bob Weaver Deinterlacing Filter)通常比 yadif 质量更好、锯齿更少:
ffmpeg -i input.m4v -vf "bwdif=1" -c:a copy output.mp4
老片源修复优先试 bwdif,观感更自然。可用 bwdif=0 控制不翻倍帧率。若设备不支持 bwdif,回退 yadif。
五、配合缩放一步到位
去隔行后顺手把分辨率降一点(老片本就不清晰,降分辨率省空间且观感无差):
ffmpeg -i input.m4v -vf "yadif=1,scale=720:-2" -c:v libx264 -crf 20 -c:a copy output.mp4
scale=720:-2 把宽缩到 720、高按比例(-2 保证偶数)。老片 720p 足够。
六、与其他修复组合
老片常有噪声,可叠加降噪(详见降噪专题):
ffmpeg -i input.m4v -vf "bwdif=1,scale=720:-2,hqdn3d=4:3:6:4" -c:v libx264 -crf 20 -c:a copy output.mp4
hqdn3d 是轻量降噪滤镜,适合老片。噪点特别重的可加 removegrain 或 nlmeans(更慢但更好)。
七、批量处理
for f in *.m4v; do
ffmpeg -i "$f" -vf "bwdif=1" -c:v libx264 -crf 20 -c:a copy "prog_$f.mp4"
done
八、去隔行滤镜对比
| 滤镜 | 质量 | 速度 | 备注 |
|---|---|---|---|
| yadif | 中 | 快 | 默认首选 |
| bwdif | 较好 | 中 | 老片修复推荐 |
| kerndeint | 中 | 快 | 老牌滤镜 |
| 不处理 | — | — | 现代播放器多自动去隔行 |
注意:很多现代播放器(VLC、MPV)已能自动去隔行,但存档/二次编辑建议预先转好,避免每次播放都临时算、且剪辑软件未必处理。
九、常见翻车现场
| 现象 | 根因 | 解法 |
|---|---|---|
| 去隔行后画面抖 | 用了 yadif=0 丢场 | 试 yadif=1 或 bwdif |
| 处理后更糊 | 源本就模糊+降分辨率过狠 | 放宽 scale 或不动分辨率 |
| 帧率翻倍太大 | yadif=1 每场一帧 | 用 yadif=0 控制体积 |
| 没效果 | 源本就逐行 | 先 ffprobe 确认 |
| 处理极慢 | 逐帧滤波+重编码 | 接受耗时或用 GPU 滤镜 |
十、常见问题
Q:去隔行会损画质吗? 会略有损(插值是估计),但消除隔行伪影的获益远大于损失。
Q:能不能只在运动时去隔行? 高级滤镜支持按运动检测,但 ffmpeg 内置的整帧处理更简单通用。
Q:4K 隔行源怎么处理? 同理用 yadif/bwdif,注意性能;若设备支持可用硬件去隔行。
Q:转完能还原隔行吗? 不能,去隔行是不可逆的信息丢弃。
Q:监控录像隔行严重怎么办? 同理 bwdif,先 ffprobe 确认 field_order 再批量。
十一、端到端实战:处理一批老 DV 素材
假设目录里一堆 .m4v 是老 DV 拍的,先确认隔行,再批量转逐行并降噪:
for f in *.m4v; do
# 确认是奇数场/偶数场(tt/tb/bt/bb)才去隔行
if ffprobe -v error -select_streams v:0 -show_entries stream=field_order -of csv=p=0 "$f" | grep -qE "tt|tb|bt|bb"; then
ffmpeg -i "$f" -vf "bwdif=1,scale=720:-2,hqdn3d=4:3:6:4" -c:v libx264 -crf 20 -c:a aac "prog_$f.mp4"
else
echo "$f 已逐行,跳过"
fi
done
这段脚本先探测 field_order,只处理真隔行的文件,避免对逐行素材做无用功。
十二、去隔行质量参数微调
bwdif 还有 parity(场奇偶)和 deint(处理全部帧还是只交错帧)参数:
# 仅对检测到的交错帧去隔行(更省、更保真)
ffmpeg -i input.m4v -vf "bwdif=mode=1:parity=auto:deint=interlaced" -c:a copy out.mp4
parity=auto 让滤镜自动判断奇偶场顺序,多数情况比手动指定更稳。
十三、更多 FAQ
Q:去隔行后文件变大很多? 重编码 + 可能帧率翻倍导致,用 bwdif=0 不翻倍、或压低码率。
Q:能不能 GPU 去隔行? 可以,硬件滤镜(如 yadif_cuda)更快,但需对应硬件和编译支持。
Q:隔行和逐行能混在一个文件? 不会,一个流是隔行或逐行;混合是切换时的显示问题。
Q:老动画要不要去隔行? 动画常是逐行或 3:2 pulldown,先确认 field_order 再决定,盲目去隔行反而损。
十四、隔行判定速查清单
- 静止正常、一运动就梳齿/横纹 → 隔行;
- ffprobe
field_order为 tt/tb/bt/bb → 隔行; - 老 DV、老电视录制、部分监控 → 默认隔行;
- 现代手机/相机/屏幕录制 → 一般逐行,无需处理;
- 拿不准 → 试
bwdif=1看观感是否改善。
小结
隔行伪影 = 老电视扫描方式与现代显示不兼容。确认 field_order 后用 yadif(快)或 bwdif(好)转逐行,老片可叠加降噪。现代播放器虽会自动去隔行,但存档和二次编辑还是预先转好最稳。