前面講的都是拿檔案來播。今天換一個玩法:把 Switch 的畫面餵進 mpv,然後把前面學的超分套上去。
Switch 大多數遊戲輸出 720p 或 1080p,接到 4K 電視上會偏軟。而 mpv 有一整套超分工具 —— 如果訊號進得來,那些工具就能用。
一張擷取卡(內接卡或外接盒都行)。
一個 HDMI 影音分離器,這個東西比你想的重要。原因等下講延遲的時候會說清楚,先講結論:聲音不要走電腦,用分離器直接接喇叭。
軟體端就是 mpv-lazy,不需要額外裝東西 —— mpv 本身就能讀 DirectShow 裝置。
mpv 要靠裝置名稱去找你的擷取卡,而這個名稱必須一字不差。
不要去裝置管理員抄 —— 那裡顯示的名字跟 DirectShow 認的名字未必一樣。用 ffmpeg 問:
ffmpeg -hide_banner -list_devices true -f dshow -i dummy

輸出裡會列出所有視訊與音訊裝置,你的擷取卡會長得像這樣:
"USB Video" (video) <--有可能是別的名子
這邊我是買雜牌的,所以名字是 "USB Video"。
連引號裡的空格和結尾那個數字都要照抄。
接著再問第二個問題 —— 這張卡支援哪些組合:
ffmpeg -list_options true -f dshow -i video="USB Video"

它會列出所有可用的解析度、fps 與像素格式。這步不要跳過,因為 DirectShow 的規則是「你要的組合不支援就直接開不起來」,它不會退而求其次挑一個接近的給你。
指令長這樣:
mpv --demuxer-lavf-o-add=video_size=1280x960,framerate=30 av://dshow:video="USB Video" --profile=low-latency --untimed
Switch 最多才 720p,幀數原本也不高,所以才設定 30fps。因為幀數太高做補幀可能造成看到腳本錯誤。

最後可以正常操作遊戲。


拆開來看:
av://dshow:video="..." —— mpv 的 libavdevice 輸入語法,把 DirectShow 裝置當成片源。--demuxer-lavf-o-add=video_size=...,framerate=... —— 告訴擷取卡你要什麼規格。--profile=low-latency —— mpv 內建的低延遲組合設定,下面說它做了什麼。--untimed —— 官方文件自己說這是個 hack:擷取到一幀就立刻輸出,不要照著幀率慢慢等。 對即時訊號來說這正是我們要的。這裡有個很容易踩的雷:我上面寫的是 --demuxer-lavf-o-add(有 -add),不是 --demuxer-lavf-o。
差別在於不帶後綴的版本是整份取代。而 --profile=low-latency 裡面自己也塞了一個 demuxer-lavf-o 設定(fflags=+nobuffer)—— 你用取代版又寫在 profile 前面,就會把它洗掉。一律用 -add 就不會有這個問題。
實務上把這串做成桌面捷徑,玩的時候點兩下就開。
low-latency 到底做了什麼這個 profile 是 mpv 內建的,一次改十項設定。挑幾個關鍵的:
audio-buffer=0 —— 音訊緩衝從預設的 200ms 壓到 0。vd-lavc-threads=1 —— 多執行緒解碼會多囤幀,所以砍成單執行緒。video-latency-hacks=yes —— 官方說法是「通常能少 1 到 2 幀的延遲」。interpolation=no —— 註解寫得很直白:需要參考幀,所以會多緩衝。
最後那一行是這篇的伏筆,等下會回來講。
技術上 mpv 可以連聲音一起吃:
av://dshow:video="你的卡":audio="你的卡的音訊裝置"
語法沒問題,但實際跑起來延遲會爆掉 —— 測試會有 2 到 3 秒延遲。
原因查得到:DirectShow 音訊裝置的預設緩衝是 500ms 的倍數,這是 ffmpeg 官方文件寫的,屬於擷取端的硬體行為,不是 mpv 的錯。更慘的是 low-latency 裡有 video-sync=audio(畫面對齊聲音),所以聲音一慢,畫面會被拖著一起慢。
三條解法,我按推薦順序排:
一、用 HDMI 分離器,聲音完全不進電腦。 最乾脆,延遲歸零,沒有同步問題。這也是我建議你買分離器的理由。
二、把緩衝調小。
--demuxer-lavf-o-add=video_size=1920x1080,framerate=60,audio_buffer_size=50
audio_buffer_size 單位是毫秒。有人實驗過:低於 4 會爆音,30 可用,100 也還行;ffmpeg 的 wiki 自己建議 50。著色器可以順跑樣子',但後來實測跑 vpy 腳本時,會延遲。就算用 Smooth Motion 也會延遲。所以還是乖乖把聲音丟給分離器吧。

video_size / framerate / audio_buffer_size 選項的官方說明。--profile=low-latency —— profile 的完整內容在 mpv 的 builtin.conf 裡。