快轉到主要內容

即時補幀提昇動畫影片FPS ~ Linux版MPV播放器 + VapourSynth MVTools設定教學

Linux系統 Linux好用軟體 Video Frame Interpolation Video Upscaling VapourSynth MPV
🗓️ 民國113年 甲辰年
✍ 切換正體/簡體字
目錄

解說如何在Linux系統設定MPV,配合VapourSynth的MVTools插件達到即時補幀效果,類似Windows上的mpv-lazy那樣。

不知何為補幀?請看這部30FPS影片補幀到60FPS後的效果:

後面再教學如何配合動畫升頻軟體Anime4K一同使用,操爆電腦硬體。

1. 本文目標
#

即時補幀(補畫格,real time interploation,motion interpolation)即在播放影片的時候將影片FPS提高(如30 FPS → 60 FPS),而不用像RIFE那樣需要等整部影片轉檔完成。

目前影片補幀的方案主要有:Vapoursynth MVTools(開源)、RIFE(開源)、DAIN(開源)、SVP - SmoothVideo Project(閉源)、DmitriRender(閉源)

Vapoursynth是一款開源的伺服器幀渲染軟體,為AviSynth的後繼者。可以用來處理影片轉檔,配合MPV播放的話即是套用其濾鏡(由插件提供)來改善影片品質,例如本文主角"MVTools",專門給影片插幀/補幀用的。

MVTools與同為補幀軟體的RIFE ( RIFE使用教學) 有什麼差呢?MVTools能在播放中給影片補幀,全靠CPU運算,雖然耗CPU資源但速度還能接受;相較之下,RIFE預設得將整部影片用GPU轉檔才能看。雖然有人嘗試將RIFE作為即時補幀插件(見 VapourSynth-RIFE-ncnn-Vulkan),但仍需要RTX等級的顯示卡才不會卡頓,對一般使用者來說要求過高。(我是窮鬼)

儘管RIFE可能是目前效果最好的開源補幀演算法了,但MVTools的補幀其實也沒到很差勁的地步,只比專有軟體SmoothVideoProject差些,所以就將就看吧。

整合補幀技術的播放軟體,最著名的專案便是 mpv-lazy了,開發者將Anime4K和MVTools內建,使用者不需要手動設定便可使用。不過該軟體因為將一堆靜態執行檔包在一起,只支援Winodws版本,Linux雖然也有原生MPV但需要手動設定一些東西。

那麼,我們不妨將目標簡化:只要能在Linux播放影片時,補幀到60FPS+提昇畫質即可,所以我們就來手動設定吧。

2. 安裝Vapoursynth與MPV
#

  • CPU:Intel I5-7400
  • GPU:Nvidia GTX1050Ti (安裝閉源驅動)
  • 系統Python版本:3.11.3
  • Vapoursynth版本:R66
  • MPV版本:0.37.0

首先需要安裝 Linux版Vapoursynth Linux版MPV。這裡列出兩個發行版的注意事項:

  1. Arch Linux最新的MPV 037.0版本已內建VapourSynth(準確來說是ffmpeg啟用Vapoursynth支援),直接安裝就好。
sudo pacman -S mpv
  1. 雖然VapourSynth已經內建在MPV,但有些插件依賴VapourSynth,所以等會我們安裝插件的時候還是得裝VapourSynth。

  2. AUR有特別版mpv-vapoursynth-git,目前應該不需要了。

  1. Ubuntu 22.04建議 手動編譯

  2. Ubuntu套件庫的MPV版本陳舊,按照官方 mpv-build指示,手動編譯最新版MPV,並啟用VapourSynth支援。

# 依賴套件
sudo apt-get install build-essential yasm intltool automake autoconf libtool devscripts equivs libavutil-dev libavcodec-dev libswscale-dev python3-dev python3-pip libx264-dev libmp3lame-dev libfdk-aac-dev libcdio-paranoia-dev libdvdnav-dev libdvdread-dev libarchive-dev

# CPython和meson用pip裝
sudo apt remove meson
python -m pip install Cython meson

git clone https://github.com/mpv-player/mpv-build.git --depth=1

cd mpv-build

cat <<EOF > ffmpeg_options
--enable-libx264
--enable-libmp3lame
--enable-libfdk-aac
--enable-nonfree
EOF

cat <<EOF > mpv_options
-Dlibmpv=true
-Dcaca=disabled
-Dcdda=enabled
-Ddvbin=enabled
-Ddvdnav=enabled
-Dlibarchive=enabled
-Dbuild-date=false
-Dvapoursynth=enabled
EOF

./rebuild -j8

# 你可以直接執行mpv/build/mpv的二進位檔,但我們還是安裝MPV到系統吧
sudo ./install

# 或者打包成deb檔再安裝
sudo apt-get install devscripts equivs
mk-build-deps -s sudo -i
sudo apt install mpv-build-deps_1.0_amd64.deb
dpkg-buildpackage -uc -us -b -j8
sudo dpkg -i ../mpv_<version>_<architecture>.deb

3. 安裝MVTools
#

  1. MVTools是VapourSynth的一個插件,需要安裝函式庫再撰寫指令稿啟用。

Arch Linux從官方套件庫安裝,它的函式庫位於/usr/lib/vapoursynth

sudo pacman -S vapoursynth-plugin-mvtools

Ubuntu 22.04需要手動編譯MVTools,函式庫會安裝到/usr/local/lib/x86_64-linux-gnu

git clone https://github.com/dubhater/vapoursynth-mvtools.git
cd vapoursynth-mvtools
mkdir build; cd build
meson ../
sudo ninja install
  1. MVTools補幀需要自行撰寫指令稿來啟用。Github上有 KCCat phiresky的範本,我選擇後者提供的.vpy檔。

  2. 切換到MPV設定檔所在目錄,下載.vpy檔案

mkdir ~/.config/mpv
cd ~/.config/mpv
wget https://gist.githubusercontent.com/phiresky/4bfcfbbd05b3c2ed8645/raw/d2431bc64b2cff0c80c5953bca71968dcdf82971/motioninterpolation.vpy
  1. phiresky的vpy有點小問題,請開啟該檔案,找到vapoursynth.get_core()的字串,將其替換成vapoursynth.core,並請注意libmvtools.so所在的路徑。

  2. 我修改過後的指令稿如下:

# vim: set ft=python:

# see the README at https://gist.github.com/phiresky/4bfcfbbd05b3c2ed8645
# source: https://github.com/mpv-player/mpv/issues/2149
# source: https://github.com/mpv-player/mpv/issues/566
# source: https://github.com/haasn/gentoo-conf/blob/nanodesu/home/nand/.mpv/filters/mvtools.vpy

import vapoursynth

core = vapoursynth.core

core.std.LoadPlugin("/usr/lib/vapoursynth/libmvtools.so")

# ref: http://avisynth.org.ru/mvtools/mvtools2.html#functions
# default is 400, less means interpolation will only happen when it will work well
ignore_threshold=140
# if n% of blocks change more than threshold then don't interpolate at all (default is 51%)
scene_change_percentage=15

dst_fps = display_fps
# Interpolating to fps higher than 60 is too CPU-expensive, smoothmotion can handle the rest.
# while (dst_fps > 60):
#    dst_fps /= 2

if "video_in" in globals():
    # realtime
    clip = video_in
    # Needed because clip FPS is missing
    src_fps_num = int(container_fps * 1e8)
    src_fps_den = int(1e8)
    clip = core.std.AssumeFPS(clip, fpsnum = src_fps_num, fpsden = src_fps_den)
else:
    # run with vspipe
    clip = core.ffms2.Source(source=in_filename)
    dst_fps=float(dst_fps)

# resolution in megapixels. 1080p ≈ 2MP, 720p ≈ 1MP
mpix = clip.width * clip.height / 1000000

# Skip interpolation for >1080p or 60 Hz content due to performance
if not (mpix > 2.5 or clip.fps_num/clip.fps_den > 59):
    analParams = {
        'overlap': 0,
        'search': 3,
        'truemotion': True,
        #'chrome': True,
        #'blksize':16,
        #'searchparam':1
    }
    blockParams = {
        'thscd1': ignore_threshold,
        'thscd2': int(scene_change_percentage*255/100),
        'mode': 3,
    }

    if mpix > 1.5:
        # can't handle these on Full HD with Intel i5-2500k
        # see the description of these parameters in http://avisynth.org.ru/mvtools/mvtools2.html#functions
        analParams['search'] = 0
        blockParams['mode'] = 0
        quality = 'low'
    else:
        quality = 'high'


    dst_fps_num = int(dst_fps * 1e4)
    dst_fps_den = int(1e4)
    print("Reflowing from {} fps to {} fps (quality={})".format(clip.fps_num/clip.fps_den,dst_fps_num/dst_fps_den,quality))

    sup  = core.mv.Super(clip, pel=2)
    bvec = core.mv.Analyse(sup, isb=True, **analParams)
    fvec = core.mv.Analyse(sup, isb=False, **analParams)
    clip = core.mv.BlockFPS(clip, sup, bvec, fvec,
            num=dst_fps_num, den=dst_fps_den,
            **blockParams)

clip.set_output()

4. 撰寫MPV設定檔啟用MVTools
#

  1. 編輯~/.config/mpv/mpv.conf,填入最基本的播放參數
keep-open=yes
sub-auto=fuzzy
hwdec-codecs=all
profile=gpu-hq
  1. 編輯~/.config/mpv/input.conf,填入開關Vapoursynth濾鏡的快捷鍵,我設定為「b」。等號後面的路徑是剛才下載的vpy檔案的位置。
b vf toggle vapoursynth=~~/motioninterpolation.vpy
  1. 如果您想要一開啟MPV就自動啟用補幀功能,在~/.config/mpv/mpv.conf加入以下內容:
vf=format=yuv420p,vapoursynth=~~/motioninterpolation.vpy:4:4
  1. 接著在檔案管理器使用MPV播放一部非60FPS的影片

  2. 按Shift+I,顯示目前影片幀率

  3. 按b啟用補幀功能,繼續播放,觀察幀率是否有變化

5. 配合Anime4K放大軟體使用
#

Anime4K是提昇動畫畫質(升頻)的軟體,可將720p變1080p,1080p變接近4K。

  1. 請參考 Linux版Anime4K教學,將Anime4K的快捷鍵設定好。如果要跟Vapoursynth一起用的話,沿著~/.config/mpv/mpv.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"

b vf toggle vapoursynth=~~/motioninterpolation.vpy
  1. 同樣,如果您希望一啟動MPV便自動啟用Anime4K的A+A模式,那就把以下內容加到~/.config/mpv/mpv.conf尾端
glsl-shaders="~~/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"

6. 播放MVTools+Anime4K影片有多耗系統資源
#

以下是播放普通1080p影片,什麼都沒開的情況

接著是啟用補幀+Anime4K的影片,可以看到GPU和CPU使用率都暴漲。

如同RIFE,Vapoursynth的MVtools也可以給影片補幀轉檔,減少播放時的開銷:

vspipe --arg in_filename="影片路徑" --arg display_fps=60 --y4m motioninterpolation.vpy -| ffmpeg -i - -crf 18 output.mkv

參考資料
#

相關文章

開源免費的AI動漫圖片 & 影片解析度放大軟體一覽
開源AI人工智慧應用 AI影像處理 Image Upscaling Video Upscaling Video Frame Interpolation Waifu2x MPV Anime4K VapourSynth
提昇影片播放效果 ~ Linux用MPV Handler播放瀏覽器的Bilibili、Youtube、巴哈動畫瘋串流影片
Linux系統 Linux好用軟體 MPV Video Upscaling Linux Bilibili
Linux版「MPV」影片播放器優化設定,圖形界面+時間軸縮圖預覽
Linux系統 Linux好用軟體 MPV Linux

留言板

此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。要討論程式碼請用Giscus,匿名討論請用Disqus。

這是Giscus留言板,需要Github帳號才能留言。支援markdown語法,若要上傳圖片請貼Imgur連結。您的留言會在Github Discussions向所有人公開。

這是Disqus留言板,您可能會看到Disqus強制投放的廣告。有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。