实时补帧+提升画质~ Archlinux 使用 Vapoursynth 插件 MVTools/RIFE 实时补帧,使用 Anime4K 实时超分

11 个月前(已编辑)
这篇文章上次修改于 10 个月前,可能部分内容已经不适用,如有疑问可询问作者。

0.前言

这里有一键配置方案了
vapoursynth plugin rife ncnn vulkan 的错误已经不需要修复 只需从 aur 安装 vapoursynth-plugin-rife-ncnn-vulkan-git 并配置 vpy 即可
Windows 已经有了一键解决方案 mpv-lazy
但 Linux 就需要手动配置啦 本文会教你如何干爆电脑硬件猛超画质帧率成为盯帧
另外,RIFE 实时补帧对于 Linux 基本上是没什么用的 配置好之后建议使用命令行补帧 笔者的 RTX3070Laptop 成功把 24f/s 的动画实时补到了 20f/s

1.安装 mpv-vapoursynth,使用 mvtools 进行实时补帧

1.由于 AUR 中 mpv 并不自带 vapoursynth,所以我们需要移除 mpv,安装 mpv-vapoursynth

sudo pacman -R mpv    
yay -S mpv-vapoursynth

2.接下来安装 vapoursynth mvtools 插件

sudo pacman -S vapoursynth-plugin-mvtools

3.接下来你需要选择一个 vpy,以启用 mvtools 补帧

这里推荐phiresky的范本

mkdir ~/.config/mpv
cd ~/.config/mpv
wget https://gist.githubusercontent.com/phiresky/4bfcfbbd05b3c2ed8645/raw/d2431bc64b2cff0c80c5953bca71968dcdf82971/motioninterpolation.vpy

4.这个 vpy 在 Linux 中有些小问题,我们将它修改

nvim motioninterpolation.vpy

在第 10 行中,把 core = vapoursynth.get_core() 替换为 core = vapoursynth.core

5.编辑 ~/.config/mpv/mpv.conf 填入基本播放参数

nvim ~/.config/mpv/mpv.conf
keep-open=yes
sub-auto=fuzzy
hwdec-codecs=all
profile=gpu-hq

6.编辑 ~/.config/mpv/input.conf,设定启用 mvtools 的快捷键

nvim ~/.config/mpv/input.conf
x vf toggle vapoursynth=~~/motioninterpolation.vpy

这样 x 就成为了 启用 mvtools 的快捷键 你可以修改为自己想要的

7.如果你想要一打开/调用 mpv 播放视频就启用 mvtools 进行补帧,在mpv.conf中加入这些内容

vf=format=yuv420p,vapoursynth=~~/motioninterpolation.vpy:4:4

8.修改你的目标帧数

motioninterpolation.vpy文件中
dst_fps = display_fps 设定了目标帧数等于你屏幕的显示帧数
这会对带有高刷新率屏幕的电脑带给很高压力(CPU:你礼貌吗)
如果你想把它改成 60 帧
只需把 display_fps 修改为 60 即可

9.确认修改是否成功

1.打开任意一帧率不足 60 帧的视频

2.按下你设置的启用 mvtools 的快捷键(x)

3.按下 shift+i 查看显示信息 已经能看出来了吧


补帧效果

2.加入 Anime4K 着色器实时超分

1.获取 GLSL 并复制到 mpv 的 shaders 目录

git clone https://github.com/bloc97/Anime4K.git
cd Anime4K
mkdir ~/.config/mpv/shaders
find glsl -type f -exec cp "{}" ~/.config/mpv/shaders \;

2.在 ~/.config/mpv/input.conf 写入快捷键

CTRL+1 no-osd change-list glsl-shaders set "~~/shaders/Anime4K_Clamp_Highlights.glsl:~~/shaders/Anime4K_Restore_CNN_M.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_M.glsl:~~/shaders/Anime4K_AutoDownscalePre_x2.glsl:~~/shaders/Anime4K_AutoDownscalePre_x4.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_S.glsl"; show-text "Anime4K: Mode A (Fast)"
CTRL+2 no-osd change-list glsl-shaders set "~~/shaders/Anime4K_Clamp_Highlights.glsl:~~/shaders/Anime4K_Restore_CNN_Soft_M.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_M.glsl:~~/shaders/Anime4K_AutoDownscalePre_x2.glsl:~~/shaders/Anime4K_AutoDownscalePre_x4.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_S.glsl"; show-text "Anime4K: Mode B (Fast)"
CTRL+3 no-osd change-list glsl-shaders set "~~/shaders/Anime4K_Clamp_Highlights.glsl:~~/shaders/Anime4K_Upscale_Denoise_CNN_x2_M.glsl:~~/shaders/Anime4K_AutoDownscalePre_x2.glsl:~~/shaders/Anime4K_AutoDownscalePre_x4.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_S.glsl"; show-text "Anime4K: Mode C (Fast)"
CTRL+4 no-osd change-list glsl-shaders set "~~/shaders/Anime4K_Clamp_Highlights.glsl:~~/shaders/Anime4K_Restore_CNN_M.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_M.glsl:~~/shaders/Anime4K_Restore_CNN_S.glsl:~~/shaders/Anime4K_AutoDownscalePre_x2.glsl:~~/shaders/Anime4K_AutoDownscalePre_x4.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_S.glsl"; show-text "Anime4K: Mode A+A (Fast)"
CTRL+5 no-osd change-list glsl-shaders set "~~/shaders/Anime4K_Clamp_Highlights.glsl:~~/shaders/Anime4K_Restore_CNN_Soft_M.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_M.glsl:~~/shaders/Anime4K_AutoDownscalePre_x2.glsl:~~/shaders/Anime4K_AutoDownscalePre_x4.glsl:~~/shaders/Anime4K_Restore_CNN_Soft_S.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_S.glsl"; show-text "Anime4K: Mode B+B (Fast)"
CTRL+6 no-osd change-list glsl-shaders set "~~/shaders/Anime4K_Clamp_Highlights.glsl:~~/shaders/Anime4K_Upscale_Denoise_CNN_x2_M.glsl:~~/shaders/Anime4K_AutoDownscalePre_x2.glsl:~~/shaders/Anime4K_AutoDownscalePre_x4.glsl:~~/shaders/Anime4K_Restore_CNN_S.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_S.glsl"; show-text "Anime4K: Mode C+A (Fast)"
CTRL+0 no-osd change-list glsl-shaders clr ""; show-text "GLSL shaders cleared"

平常的动漫超分只需要 CTRL+4 就够了 清除着色器只需 CTRL+0

3.按下 shift+i 查看效果


超分效果

3.使用 RIFE(不建议)

RIFE 对于显卡的要求十分高,虽然效果较好但通常仅用于补帧后观看
这里给出 RIFE 进行实时补帧的用法

如果你直接在 AUR 中安装vapoursynth-plugin-rife-ncnn-vulkan-git,会有不能 build 的错误 参考这里

1.安装 vulkan-headers meson

paru -S vulkan-headers meson

2.安装 VapourSynth-RIFE-ncnn-Vulkan

git clone https://github.com/HomeOfVapourSynthEvolution/VapourSynth-RIFE-ncnn-Vulkan.git
cd VapourSynth-RIFE-ncnn-Vulkan
git submodule update --init --recursive --depth 1
meson build
ninja -C build

3.它报错了

[479/484] Compiling C++ object librife.so.p/RIFE_plugin.cpp.o
FAILED: librife.so.p/RIFE_plugin.cpp.o 
c++ -Ilibrife.so.p -I. -I../rife-ncnn-vulkan -Isubprojects/ncnn/__CMake_build -I../rife-ncnn-vulkan/subprojects/ncnn/__CMake_build -Isubprojects/ncnn -I../rife-ncnn-vulkan/subprojects/ncnn -I../rife-ncnn-vulkan/subprojects/ncnn/glslang -Isubprojects/ncnn/__CMake_build/include -I../rife-ncnn-vulkan/subprojects/ncnn/__CMake_build/include -I../rife-ncnn-vulkan/subprojects/ncnn/src/layer/x86 -I../rife-ncnn-vulkan/subprojects/ncnn/src -Isubprojects/ncnn/__CMake_build/src -I../rife-ncnn-vulkan/subprojects/ncnn/__CMake_build/src -I../rife-ncnn-vulkan/subprojects/ncnn/src/layer -I/usr/include -I/usr/include/vapoursynth -fvisibility=hidden -flto=auto -fdiagnostics-color=always -DNDEBUG -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -Wextra -std=c++20 -mfpmath=sse -msse2 -march=x86-64 -mtune=generic -O2 -pipe -fno-plt -fexceptions -Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fstack-clash-protection -fcf-protection -Wp,-D_GLIBCXX_ASSERTIONS -g -ffile-prefix-map=/home/soph/.cache/paru/clone/vapoursynth-plugin-rife-ncnn-vulkan-git/src=/usr/src/debug/vapoursynth-plugin-rife-ncnn-vulkan-git -fPIC -fno-exceptions -pthread -fopenmp -MD -MQ librife.so.p/RIFE_plugin.cpp.o -MF librife.so.p/RIFE_plugin.cpp.o.d -o librife.so.p/RIFE_plugin.cpp.o -c ../rife-ncnn-vulkan/RIFE/plugin.cpp
../rife-ncnn-vulkan/RIFE/plugin.cpp: In function ‘void rifeCreate(const VSMap*, VSMap*, void*, VSCore*, const VSAPI*)’:
../rife-ncnn-vulkan/RIFE/plugin.cpp:160:19: error: exception handling disabled, use ‘-fexceptions’ to enable
  160 |             throw "only constant RGB format 32 bit float input supported";
      |                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../rife-ncnn-vulkan/RIFE/plugin.cpp:431:46: error: ‘error’ was not declared in this scope; did you mean ‘perror’?
  431 |         vsapi->mapSetError(out, ("RIFE: "s + error).c_str());
      |                                              ^~~~~
      |                                              perror
[482/484] Compiling C++ object subprojects/ncnn/libSPIRV.a.p/glslang_SPIRV_GlslangToSpv.cpp.o
../rife-ncnn-vulkan/subprojects/ncnn/glslang/SPIRV/GlslangToSpv.cpp: In member function ‘void {anonymous}::TGlslangToSpvTraverser::TranslateLiterals(const glslang::TVector<const glslang::TIntermConstantUnion*>&, std::vector<unsigned int>&) const’:
../rife-ncnn-vulkan/subprojects/ncnn/glslang/SPIRV/GlslangToSpv.cpp:1331:33: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
 1331 |             unsigned literal = *reinterpret_cast<unsigned*>(&floatValue);
      |                                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../rife-ncnn-vulkan/subprojects/ncnn/glslang/SPIRV/GlslangToSpv.cpp: In member function ‘spv::Id {anonymous}::TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType&, glslang::TLayoutPacking, const glslang::TQualifier&, bool, bool)’:
../rife-ncnn-vulkan/subprojects/ncnn/glslang/SPIRV/GlslangToSpv.cpp:4203:41: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
 4203 |                     unsigned literal = *reinterpret_cast<unsigned*>(&floatValue);
      |                                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ninja: build stopped: subcommand failed.
==> ERROR: A failure occurred in build().
    Aborting...
error: failed to build 'vapoursynth-plugin-rife-ncnn-vulkan-git-9.0.g6c6d0fa-1': 
error: packages failed to build: vapoursynth-plugin-rife-ncnn-vulkan-git-9.0.g6c6d0fa-1

4.全剧终 我们修复一下这个报错

这个报错是 -fno-exceptions 引起的 (我不懂 cmake,有其他想法欢迎批评指正)
Linux 下确实会出现这个问题

1.进入 ~/VapourSynth-RIFE-ncnn-Vulkan/build/ninja.build

2.把里面的 -fno-exceptions 全部替换为空 (使用你的 IDE) 虽说颇为暴力,但实际上 -fno-exceptions 这种东西有点过于极端了全删掉也大丈夫

3.继续安装

ninja -C build
ninja -C build install

5.写一份 vpy 放入 ~/.config/mpv/xxx.vpy

这里给出一个示例仅供参考


import vapoursynth as vs
from vapoursynth import core

clip = video_in
clip = vs.core.resize.Bicubic(clip, format=vs.RGBS, matrix_in_s="709")
clip = core.rife.RIFE(clip, model=9, factor_num=2, gpu_id=0, gpu_thread=4, tta=False, uhd=False, skip=False, sc=False)
clip = vs.core.resize.Bicubic(clip, format=vs.YUV420P10, matrix_s="709")
clip.set_output()

6.在 ~/.config/mpv/input.conf 写入快捷键调用这个 vpy

y vf toggle vapoursynth=~~/xxx.vpy

7.如此就成功了,但是否能做到实时补帧我暂且蒙古不太清楚

评论区加载中...