把 480P 翻新成 1080P:Real-ESRGAN + ffmpeg 抽帧超分实战
前面那篇聊了"AI 超分是什么",这篇聊"怎么真的跑起来"。很多老录像、监控、早年上传压过的视频只有 480P,直接放大会糊成马赛克——因为缩放只是双线性插值,没补任何细节。超分(super-resolution)是让模型"猜"出高频细节再放大。Real-ESRGAN 是目前最省事的开源方案,这篇记我怎么把它接进视频流水线。
先想清楚:超分的是"帧",不是"视频"
视频不能直接丢给模型。正确做法是:抽帧 → 逐帧超分 → 合成回去 → 把原音轨并回去。抽帧用 ffmpeg:
ffmpeg -i in.mp4 -qscale:v 2 -qmin 1 -qmax 2 -vf fps=30 frames/frame_%06d.jpg
-qscale:v 2 保住抽帧质量(别再用有损再损一轮),fps=30 跟原帧率一致。
逐帧超分
有 GPU 用 Real-ESRGAN 的 Python 推理;没 GPU 用 realsr-ncnn-vulkan(Vulkan 版,核显都能跑)。我机器没独显,走的 ncnn:
realsr-ncnn-vulkan -i frames/ -o up_frames/ -n realesrgan-x4plus -s 4 -f jpg -g -1
-s 4 放大 4 倍(480→1920),-g -1 自动选显卡。一段 1 分钟 30fps 的片,约 1800 帧,我这台笔记本跑了 40 多分钟——超分很吃算力,别指望实时。
合成回去,音轨别丢
超分只出图,没声音。先把图序列合成视频,再并原音轨:
ffmpeg -framerate 30 -i up_frames/frame_%06d.jpg -c:v libx264 -crf 18 up_silent.mp4
ffmpeg -i up_silent.mp4 -i in.mp4 -map 0:v -map 1:a -c:v copy -c:a copy final.mp4
坑一:色彩发灰
Real-ESRGAN 默认 RGB,ffmpeg 抽帧常是 YUV,来回转容易偏色。我后来抽帧时加 -pix_fmt rgb24,合成时再转回,灰的问题没了。
坑二:体积暴增
480P 抽成 1080P,即使 -crf 18 也大几倍。如果是存档用,超分完再用前面压缩那篇的参数压一道,权衡清晰度和体积。
嫌拆帧麻烦?用 video2x
video2x 把 waifu2x/realsr/rife 封装成一条命令,直接吃视频吐视频:
video2x -i in.mp4 -o out.mp4 -p realesrgan -s 4
省去抽帧合成,但可控性低。想精调还是自己拆帧。
一点实话
超分救"模糊",救不了"没拍清楚"。480P 糊成一片的监控,超完还是能看出是 480P 的细节量,只是边缘更利。别指望变出原来没有的信息。真要清晰,源头拍好最实在。