解說如何在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。這裡列出兩個發行版的注意事項:
- Arch Linux最新的MPV 037.0版本已內建VapourSynth(準確來說是ffmpeg啟用Vapoursynth支援),直接安裝就好。
sudo pacman -S mpv
雖然VapourSynth已經內建在MPV,但有些插件依賴VapourSynth,所以等會我們安裝插件的時候還是得裝VapourSynth。
AUR有特別版
mpv-vapoursynth-git
,目前應該不需要了。
Ubuntu 22.04建議 手動編譯
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#
- 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
mkdir ~/.config/mpv
cd ~/.config/mpv
wget https://gist.githubusercontent.com/phiresky/4bfcfbbd05b3c2ed8645/raw/d2431bc64b2cff0c80c5953bca71968dcdf82971/motioninterpolation.vpy
phiresky的vpy有點小問題,請開啟該檔案,找到
vapoursynth.get_core()
的字串,將其替換成vapoursynth.core
,並請注意libmvtools.so
所在的路徑。我修改過後的指令稿如下:
# 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#
- 編輯
~/.config/mpv/mpv.conf
,填入最基本的播放參數
keep-open=yes
sub-auto=fuzzy
hwdec-codecs=all
profile=gpu-hq
- 編輯
~/.config/mpv/input.conf
,填入開關Vapoursynth濾鏡的快捷鍵,我設定為「b」。等號後面的路徑是剛才下載的vpy檔案的位置。
b vf toggle vapoursynth=~~/motioninterpolation.vpy
- 如果您想要一開啟MPV就自動啟用補幀功能,在
~/.config/mpv/mpv.conf
加入以下內容:
vf=format=yuv420p,vapoursynth=~~/motioninterpolation.vpy:4:4
接著在檔案管理器使用MPV播放一部非60FPS的影片
按Shift+I,顯示目前影片幀率
按b啟用補幀功能,繼續播放,觀察幀率是否有變化
5. 配合Anime4K放大軟體使用#
Anime4K是提昇動畫畫質(升頻)的軟體,可將720p變1080p,1080p變接近4K。
- 請參考
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
- 同樣,如果您希望一啟動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
參考資料#
- Realtime motion interpolating 60fps playback in mpv · GitHub
- dreamer2908/How to VapourSynth, flash3kyuu_db for mpv on Ubuntu & Mint.rst · GitHub
- Installation — VapourSynth documentation
- linux下mpv播放姿势分享vapoursynth-mvtools(9/5更新mvtools配置参数) - Anime字幕论坛
- MPV mvtools补帧| 附保姆级操作流程 - Anime字幕论坛
- 心情随笔 mpv最新版安装方式 ,有不对的希望大家提醒更正 - deepin