X264视频降噪研究

现在童鞋们压x264视频基本上都是使用crf裸压吧。crf固然简单方便质量高但是也存在一些问题,其中一个比较突出的就是面对大码率高噪点的视频源往往压制后的码率也非常大。解决的一个办法就是在视频源与编码器之间加降噪滤镜。
传统的AVISynth支持许多强大好用的滤镜但是在Linux上面都用不了,好在强大而且跨平台的FFmpeg也支持许多强大的滤镜。

视频源信息

选取相机直录的一段视频,完美符合大码率高噪点的特性。

Stream #0:0: Video: mpeg4 (Advanced Simple Profile) (XVID / 0x44495658), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 12272 kb/s, 30 fps, 30 tbr, 30 tbn, 30 tbc

不使用滤镜

使用ffmpeg -i in.avi -an -vcodec libx264 out.mp4进行压制后的视频,

Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 6814 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc

可以看到码率下降了约一半,肉眼无法观测到与视频源存在明显差别。

使用的滤镜

检索FFmpeg的官方文档得到如下专门用于降噪的滤镜,
– atadenoise
– dctdnoiz
– hqdn3d
– owdenoise
– removegrain
接下来会分别测试这些滤镜使用默认参数的表现。

滤镜的效果

实际测试的时候发现atadenoise, removegrain这款两滤镜并没有内建在官方最新的二进制文件中,极有可能是因效果不佳而被放弃了吧。

hqdn3d

使用这款滤镜进行压制的感受就是这款滤镜对转码速度的影响并不明显,转码后的文件信息如下,

Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 4306 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc

可以看到码率对比使用滤镜前再次下降了约三分之一,肉眼可以观察到噪点下降的同时没有明显细节损失。

dctdnoiz

这款滤镜把转码速度从60fps降低到了4fps。默认降噪参数为0比较jiong。使用FFmpeg示例的dctdnoiz=4.5参数进行转码后的文件信息如下,

Stream #0:0(und): Video: h264 (High 4:4:4 Predictive) (avc1 / 0x31637661), yuv444p, 1280x720 [SAR 1:1 DAR 16:9], 4953 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc

可以看到码率下降幅度也是约三分之一,肉眼观察到的效果来看也没有明显细节损失。

owdenoise

这个滤镜把转码速度降低到了0.8fps这样一个夸张的数值,等转码是一个漫长的故事。转码后的文件信息如下,

Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 5459 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc

得到了最佳的码率,同样肉眼来看也得到了最佳的降噪效果只不过速度实在太慢。

进一步测试

上一步测试的结果中,默认参数表现比较突出的两款滤镜是hqdn3d(速度快)和owdenoise(效果好)。翻阅文档后得知owdenoise的默认参数就是最小参数,hqdn3d的默认参数也是相对较小的参数。

由于owdenoise的速度实在太慢我不敢想继续跳高参数后的测试要等转码到何年何月,接下来只测试下hqdn3d的参数调节效果。文档上并没有提到参数的取值范围,只提到了默认参数是hqdn3d=4,渐近调节该值进行测试。

hqdn3d=8的参数转码后的文件信息如下,

Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 3739 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc

码率下降和肉眼可见的噪点下降都非常明显,同时并没有观察到明显的细节损失。

hqdn3d=12的参数转码后的文件信息如下,

Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 3249 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc

码率的下降基本上是线性的,到这个时候已经可以观察一些明显可见的细节损失。测试结束。

发表评论

电子邮件地址不会被公开。 必填项已用*标注