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

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

Fedora安装Chromium浏览器

/**2014年10月16日
* Fedora在社区连接里面添加了新的内容,所以本文实际上已经少了很多参考价值。
* 社区连接: http://fedoraproject.org/wiki/Chromium
* 里面有PepperFlash的RPM包。
**/

在Fedora的默认仓库里面是没有Chromium软件包的,这是因为早期版本的Chromium在Fedora工作得不是很好,于是就交给社区仓库维护,到现在虽然已经步入Stable版本但依然放在社区仓库里面。

添加社区仓库请参考如下链接。
http://fedoraproject.org/wiki/Chromium

执行命令。

# yum install chromium -y

这里有一个问题,那就是新版的Chrome/Chromium浏览器移除了NPAPI插件接口,也就是说Flash插件不能用了,好在有谷歌提供的PPAPI接口的Flash插件,到现在已经更新到了ver15,非常的新。

添加google-chrome软件源。

# vi /etc/yum.repos.d/google-chrome.repo
[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/x86_64
enabled=1
gpgcheck=1

添加之后无需安装,下载安装包即可。

$ yumdownloader google-chrome-stable

下载下来后提取压缩包里面的/opt/google/chrome/PepperFlash/libpepflashplayer.so到某一目录。你当前用户必须拥有目录的完全读写权限,否则插件无法加载(这点有点奇怪)。

然后编辑浏览器启动脚本。

# vi /usr/bin/chromium-browser

找到这行。

CHROMIUM_FLAGS="--enable-plugins --enable-extensions --enable-user-scripts --enable-printing --enable-sync --auto-ssl-client-auth"

在这行下面添加如下几行。

flashso="/path/libpepflashplayer.so" # 改成你提取的文件的路径

if [ -f $flashso ]
then
        flashversion=`strings $flashso|grep "^\[@LNX"|sed -e "s/\[@LNX //"|sed -e "s/,/./g"`
        CHROMIUM_FLAGS="$CHROMIUM_FLAGS --ppapi-flash-path=$flashso --ppapi-flash-version=$flashversion"
fi

启动浏览器即可看到效果。如果出现Flash插件频繁crash事件,请更新显卡驱动,这里不详细说了。

I卡下的VMware Player 3D加速

一开始我以为显卡驱动问题导致不能开启,就跑到这里下载了驱动。

https://01.org/linuxgraphics/

然后发现还是不行。一番搜索发现了这个玩意。

http://askubuntu.com/questions/181829/how-to-fix-3d-acceleration-for-vmware-workstation-9

确保虚拟机是关闭的,在对应的vmx文件最后加入如下一行

mks.gl.allowBlacklistedDrivers = "TRUE"

启动虚拟机即可。

原来Intel核芯显卡被VMware认为不稳定,默认是不开启3D加速特性的,需要自行添加语句打开。