我過去用過最省資源播放器是 mpc,我們在 mpv 用的腳本在 mpc 會不會有更好效能體驗,我這邊就想嘗試看看。
mpv-lazy 那些 .vpy 腳本,能不能搬到 MPC 上跑?
答案是可以,但我最後的結論是不建議搬。這篇會把理由講清楚,因為「試了發現不值得」也是有用的資訊。
這邊我是直接使用 SVP Pro4 MPC-HC,這邊有要用的自己安裝。
第一步,先裝 VapourSynth。 這條路不能用 mpv-lazy 內建的那份 —— DirectShow 濾鏡是系統層的東西,它要找系統裝好的 VapourSynth。要 R55 以上。
第二步,下載解壓。 去 CrendKing/avisynth_filter 抓 release,檔名是 SynthFilters.zip(不到 1MB)。
解壓到一個你絕對不會搬動的目錄。
第三步,以系統管理員執行 install.cmd。

那個 install.cmd 裡面其實只有三行,就是叫 regsvr32 去註冊三個 .ax 檔。而且它自己不會檢查有沒有管理員權限 —— 沒有的話會失敗或跳 UAC,但腳本不會告訴你「你忘了用管理員身分」。
第四步,在 MPC 裡加進外部濾鏡。
MPC-HC 的路徑是:檢視 → 選項 → 內建濾鏡 → 外部濾鏡分頁 → Add Filter → 從清單裡選 VapourSynth Filter

MPC-BE 的話「外部篩選器」是左側清單直接一項,不在內建濾鏡底下。
第五步,在濾鏡的內容頁指定要載入哪個 .vpy 檔。
import vapoursynth as vs
from vapoursynth import core
import k7sfunc as k7f
clip = VpsFilterSource # 原本是 video_in
clip = k7f.FMT_CTRL(clip, h_max=1080)
clip = k7f.RIFE_NV(clip, model=46,
fps_in=VpsFilterSource.fps, # 原本是 container_fps
fps_num=2, gpu=0, gpu_t=2)
clip.set_output()
再來設定腳本就會生效。

為什麼一定要「註冊到系統」
這一步很多教學只說「要跑 install.cmd」,不說為什麼,結果出問題的人不知道往哪查。DirectShow 濾鏡是 COM 元件。 播放器不是去掃某個資料夾找濾鏡檔,而是去問 Windows:「系統裡註冊了哪些 DirectShow 濾鏡?」
regsvr32做的事就是把「這個濾鏡的識別碼 → 這個.ax檔的絕對路徑」寫進註冊表。
這是全篇最硬的一節,也是「不值得搬」這個結論的主要來源。
mpv 執行 .vpy 的時候會注入七個變數給腳本用:
video_in # 來源 clip
video_in_dw # 來源顯示寬度
video_in_dh # 來源顯示高度
container_fps # 片源幀率
display_fps # 螢幕更新率
display_res # 螢幕解析度
user_data # 使用者自訂資料
而 DirectShow 這個濾鏡只注入三個,名字也完全不同:
VpsFilterSource # 來源 clip
VpsFilterSourcePath # 來源檔案路徑
VpsFilterDisconnect # 設非零值可以讓濾鏡自己脫離
所以你把 mpv-lazy 的 .vpy 原封不動丟給 MPC,Python 在第一次碰到 video_in 的時候就 NameError,腳本載入失敗。
能對應的部分:
video_in → 改成 VpsFilterSource
container_fps → 改成 VpsFilterSource.fps(這個濾鏡會把 clip 的 fps 屬性設成平均幀率,社群的說法是等價於 mpv 的 container_fps)改完之後大概長這樣:
import vapoursynth as vs
from vapoursynth import core
import k7sfunc as k7f
clip = VpsFilterSource # 原本是 video_in
clip = k7f.FMT_CTRL(clip, h_max=1080)
clip = k7f.RIFE_NV(clip, model=46,
fps_in=VpsFilterSource.fps, # 原本是 container_fps
fps_num=2, gpu=0, gpu_t=2)
clip.set_output()
FPS_CTRL 那些參數的說明。