视频里有一种东西,编码器碰到它就像撞上铜墙铁壁——胶片颗粒。它每一帧、每一处都在无规律地抖动,运动预测几乎失灵,编码器只能在“烧掉大量比特保留噪声”和“涂抹成蜡像脸”之间二选一。AV1给出的第三条路,是把颗粒拆下来,编码干净画面,播放时再让解码器原样“种”回去。这事儿靠不靠谱,FFmpeg敲一行参数就能在自己的素材上验一验。
颗粒和传感器噪点的麻烦在于不可预测。AV1的胶片颗粒合成(Film Grain Synthesis, FGS)在编码端对颗粒建模,把几个参数塞进码流里,只占几个字节。解码端当作后处理步骤,靠统计特征重新画上匹配的颗粒。你浏览器里的dav1d解码器,现在已经在线上这么干了。说的不如动手,我们直接上命令。
![]()
第一步,查工具链。需要编译了libsvtav1的FFmpeg。FFmpeg 5.1以上就能把参数传给SVT-AV1,用最新的7.x或8.x系列就行,比如2026年3月已到8.1版,再搭一个年初发布的SVT-AV1 4.x:
ffmpeg -version | head -1ffmpeg -hide_banner -encoders | grep svtav1
如果没有libsvtav1那一行,去下个静态构建版本,或用brew、发行版包管理器装一个。选测试片段要真带颗粒的,胶转磁的影片、低光素材、演唱会录音都行。拿屏幕录制那种干净画面试FGS,看不出任何效果——因为没颗粒可建模。先切一段60秒样本,让迭代快起来:
ffmpeg -ss 00:05:00 -i source-master.mov -t 60 -c copy sample.mov
第二步,跑一个对照组,不带颗粒处理的普通SVT-AV1编码:
ffmpeg -i sample.mov -c:v libsvtav1 -preset 5 -crf 32 -pix_fmt yuv420p10le -svtav1-params tune=0 -an baseline.mkv
参数稍解释下:preset 5是画质与速度的平衡点,crf 32给1080p做个起步的质量锚点,tune=0选感知优化,而10比特的yuv420p10le即便对8比特源也是AV1常规操作,能减少色带。
第三步,打开胶片颗粒合成,只多一行参数:
ffmpeg -i sample.mov -c:v libsvtav1 -preset 5 -crf 32 -pix_fmt yuv420p10le -svtav1-params tune=0:film-grain=8:film-grain-denoise=1 -an grain-synth.mkv
新增的两个旋钮:film-grain=8是颗粒建模等级,范围0到50。社区经验在实际中挺稳——正常颗粒感的实拍素材用8左右,动画或干净数字源用4,只有那种真正噪点爆棚的扫描件才拉高。film-grain-denoise=1让编码器把建完模的颗粒从帧画面里真正移除再编码,这就是噪声源素材上省流的大头,因为编码器此刻面对的是一幅干净、容易预测的图像。如果关掉它,合成颗粒会叠在编码里仍然(昂贵)保留着的颗粒之上,等于白忙。
要验证省了多少,并排对比两个输出文件的大小,再看看画面上颗粒的质感。FGS不是为了把噪点抹成镜面,而是保住那股胶片感,让码率显著下降。最终评判标准只有一个:你的眼睛。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.