Fedora23无法启动VMware软件

其实是VMware使用了内置so这种不科学的打包方式并且打包失误了。解决方法很简单,用编辑器打开/usr/bin/vmware脚本,搜索两处exec关键字,在exec前面插入LD_PRELOAD=/usr/lib/vmware/lib/libglibmm-2.4.so.1/libglibmm-2.4.so.1,每次软件更新都需要重新编辑。示例如下。

LD_PRELOAD=/usr/lib/vmware/lib/libglibmm-2.4.so.1/libglibmm-2.4.so.1 exec "$libdir"/bin/"vmware" "$@"

吐槽一下所谓大企业办事的态度。Fedora23自发布以来VMware软件已经经历过了大小更新数次却没有解决问题,而我在数个月前就发送过邮件说明此bug,至今无回复。

视频编码器nvenc/x264横向对比

测试视频

Stream #0:0(eng): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv), 1920×1080 [SAR 1:1 DAR 16:9], 16018 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)

测试环境

  • FFmpeg-2.6.7(with build-in x264 and nvenc)
  • Intel-i7-4790K@4.4GHZ
  • Nvidia-GTX-960@358.16

测试命令

FFmpeg的wiki上面说nvenc是支持crf的然而我实测不支持,2pass也是不支持的。公平起见x264也使用默认参数对比。

time ffmpeg -i in.mp4 -an -c nvenc -preset hq out.nvenc.mp4
time ffmpeg -i in.mp4 -an -c libx264 -preset veryslow out.x264.mp4

测试结果

编码器 比特率 时间秒
nvenc 9064k 9.836
x264 5484k 222.908

质量对比

使用FFmpeg截取三段视频的同一帧放大对比观察。x264细节丢失最多,我猜测可能是码率较低的原因。

再次测试

将nvenc编码器恒定码率与同码率输出的x264进行对比。

time ffmpeg -i ‘/home/yiwan/Videos/in.mp4’ -an -codec nvenc -preset hq -b 5500k out.nvenc.cbr.mp4

最终输出视频信息如下。

Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv), 1920×1080 [SAR 1:1 DAR 16:9], 5517 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)

截取单帧图像放大对比,细节丢失非常严重。

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

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