4k 10bit hdr 视频插帧播放 - 技术方案选择
这篇文章讲的是为什么在windows系统上使用 MPC-BE + svp + madvr 来做视频插帧播放是最好的选择。
1 目标
想要实现下面的视频播放:4K, 10bit, HDR, 插帧到 60fps, 使用高质量的渲染器来做视频渲染
其他更低画质的视频也应该能正常高质量播放,比如:
- 4K, 10bit, SDR, 插帧到60fps, 使用高质量的渲染器来做视频渲染
- 4K, 8bit, SDR, 插帧到60fps, 使用高质量的渲染器来做视频渲染
- 1080p, 8bit, SDR, 插帧到60fps, 使用高质量的渲染器来做视频渲染
- 720p, 8bit, SDR, 插帧到60fps, 使用高质量的渲染器来做视频渲染
- 其他更低分辨率, 8bit, SDR, 插帧到60fps, 使用高质量的渲染器来做视频渲染
2 可选方案概览
为了满足上面的目标,有两个可选方案:
1. MPC-BE + LAV Filters + AviSynth Filter(AVSF) + SVP + madVR
这个是推荐的方案
2. mpv + smplayer(可选,mpv其实是个命令行程序,smplayer 就是个 GUI 外壳) + SVP
不推荐使用这个方案,比方案1要多消耗非常多的CPU资源,并且画质没有改善。
3 为什么要排除掉非 SVP 的插帧方案?
其实除了 SVP 之外,还有很多其他的视频插帧软件,那么为什么他们不在可选方案列表里面呢?
3.1 可选方案
(1) AMD Fluid Motion / Bluesky Frame Rate Converter
看网上评价,简单的平移的画面会做插帧操作,复杂的运动画面不会做插帧操作。
不支持 HDR
使用 AMD 显卡做运算
(2) dmitrirender
看网上评价,就算是静态的画面也会有模糊。
使用显卡做运算
自己使用体验还不错,插帧效果很好,也没有什么伪影问题
支持HDR
主要使用CPU做运算
(4) madVR smooth
这个是为了解决 judder 问题做的,不是插帧
3.2 网上的评价
我自己的使用经验是,在同样皆为预设值之下,
DR有着最佳的流畅度丶中等的伪影丶低CPU使用率,因此有些使用者会推荐选择使用DR,
至于缺点则是 模糊 ,不论是如何的画面,都会变得模糊一些,连静态画面也会。
AFM流畅度较低丶伪影较少,缺点为限定AMD显卡(还有少部分Intel内显)。
SVP则是流畅度中等丶伪影多且明显丶显示卡消耗较低,缺点是CPU消耗高,
不过SVP在经过调整参数后可以达到最高流畅度,中低伪影,也是三者内可调参数最多的滤镜,
虽说其他二者不用调参数很方便,但也因为没办法调整参数来针对特定影片优化。
3.3 比较视频
AMD Fuild Motion vs SVP 看过去是 SVP 稍微好一点
BFRC(FM)、DmitriRender、SVP补帧比较 BFRC,DmitriRender 流畅度比不上 SVP。SVP 能把原来是模糊的运动画面补清晰了。DmitriRender 有些画面感觉有些模糊。
3.4 结论
看了这些比较视频,感觉还是 SVP 最好了。
4 为什么要排除掉第二种 mpv 的方案
之前我用的是 mpv 加载 svp 来做这件事情,这样确实可以 4k 10 bit hdr 视频插帧,但是遇到了下面的问题:
- mpv 的配置文件是文本文件,改起来需要把官方的超级长的文档读一遍,配置成本太高。
- mpv + svp 的性能远远没有 MPC-BE + svp 来的好。
svp 新版本终于支持了 DirectShow 播放器正确处理 10bit + HDR 的影片了。
更新 svp 版本之前,有些时候 mpv 会卡的掉帧,但是 mpv 进程没法用完所有的 cpu 资源,估计是优化问题。
更新了 svp 版本之后,mpv 没有以前那么卡顿了,然而mpv进程 cpu占用率也提高了。
注:svp 在 mpv 的进程中运行;更新 svp 的时候,mpv 也被一起更新了。
4.1 测试:svp 在不同视频播放器下面的性能问题-不使用 Nvidia Optical Flow
svp 官方说 mpc-be 的性能远好于 mpv:
4K playback in MPC-HC 64-bit is significantly faster than in mpv
自己使用同一段 3840 * 2160 10bit 24FPS HEVC 视频测试了下,比较了下 mpc-be 和 mpv,mpv 居然多消耗了 40% 的 CPU。试了下不通过 smplayer 调用 mpv,直接在 svp 里面打开 mpv 播放视频,还是这样。在 cpu 用满的时候,会出现掉帧的问题。
使用 mpv 播放视频的时候
不知道为什么,System 以及一些其他进程也会占用很多的 CPU 资源,每个其他进程占用的 CPU 资源都不多,但是加起来会达到 10%。使用 MPC-BE 的时候其他进程占用的 CPU 资源会少很多。
total: 96
mpv: 86
使用 mpc-be + lav + mad-vr 播放视频的时候
total: 68
mpc-be: 62
4.2 测试:svp 在不同视频播放器下面的性能问题-使用 Nvidia Optical Flow
SVP 参数:Use Nvidia Optical Flow, Accurary High, Motion Vectors Grid 8px
mpv
卡顿到严重掉帧
mpc-be
一点都不卡,而且有一堆剩余的 gpu 资源。
其他问题
不过用 enermy 这部片测试了下,这个配置还是会出现画面残影的问题,需要调整到 4px 才能避免。但是 4px 会导致 4K 视频播放卡住。
使用 Nvidia Optical Flow 之后,拖动视频进度条的时候倒是快了很多。
4.3 结论
需要换成 MPC-BE 来做视频插帧,不管使用 CPU 还是 GPU,性能都比 mpv 好太多了。
5 为什么使用 madVR
windows 自带的 EVR(Enhanced Video Renderer) 不支持处理 10bit 的视频,强行用它播放会有画质损失,之前又排除了 mpv 方案,自然也排除了 mpv 使用的渲染器。这样的话,市面上剩下的视频渲染器只剩下 madVR 了。madVR 支持 10bit HDR 视频的处理。
6 不同软硬件组合对 10bit 的支持情况
前面已经确定了插帧方案 SVP,视频渲染器 madVR。那么只剩下色彩深度 10bit 的支持需要考虑了。
软件/硬件 | 支持10bit? | 备注 |
显示器 LG 27UL650-W | ✓ | 8bit抖动成 10bit |
接口 DisplayPort | ✓ | Wikipedia |
显卡&图形界面API | ✓ |
windows 上用 directx 全屏模式,Nvidia 部分的消费级显卡也能支持:
|
madVR | ✓ | |
Lav Filters | ✓ | |
Smooth Video Project | ✓ |
7 MPC-BE + LAV Filters + AviSynth Filter(AVSF) + SVP + madVR 的视频处理流程
注意下面的资料不是从 MSDN 获取的,所以细节准确性会有些问题。不过基本的流程是正确的。
整个视频处理流程(DirectShow): Source Filter => Splitter => Video Decoder => Post Filter => Video Renderer
视频播放器
这个实际上会涉及到这个流水线的选择。madVR 基于 DirectShow,所以必须使用 DirectShow 技术的视频播放器,所以就是上面的 DirectShow 的处理流程。mpv, vlc 之类的是另外一个流程,为什么不用 mpv 前面说过了。
Potplayer 根据 2013 年的 《视频播放的调教 PlaybackGame v0.4》 对于 madVR 的支持有很多问题,然后根据网络上众多文章,都说默认配置很坑爹,所以就排除掉好了。
我们这里暂定:MPC-BE
Splitter
这个不重要,一般不用特意考虑
Video Decoder
LAV 这个可以完美支持 10 bit 输出
Post Filter(SVP)
根据 SVP 架构,现在是这里加入插帧的。
SVP:支持10bit的插帧软件。其他还有AMD Fluid Motion / Bluesky Frame Rate Converter,dmitrirender,但是都不支持HDR,或者直接不支持10bit.
Video Renderer
madVR: video renderer。基于 DirectShow
完整的流程
MPC-BE 这个 DirectShow 播放器下:LAV Source => LAV Splitter => LAV Video Decoder => Post Filter / Avisynth => Post Filter / SVPflow => MPC-BE 自带的字幕渲染器 => madVR Video Renderer => 显示器输出
参考资料