或許筆電播放影片的時候可以不要那麼耗電。
使用Linux系統,你一定會常常遇到播放影片的需求。譬如瀏覽器播放影片,有時候CPU會花很多資源去解碼(decode)影片,導致系統CPU使用率標升,容易耗電,對筆電系統來說很是不利。且影片如果是4K畫質以上,不夠強的CPU也容易lag。若是能透過硬體加速(hardware video acceleration)解碼,讓GPU分擔CPU的工作,那就能加速影片播放,並達到省電的效果。
例子:啟用硬體加速的影片播放佔用CPU資源差異。
硬體加速技術也可以協助影片編碼(encode),在轉檔影片的時候加速輸出。
附註:這裡討論的是GPU硬體加速解碼與編碼影片,並非3D加速。Linux即使GPU玩遊戲的3D硬體加速正常,也不代表影片硬體加速有運作。有時候需要手動設定。
1. Linux的影片編解碼加速技術概觀#
GPU加速技術,自是由GPU晶片的廠商提供的。
以x86架構的Linux系統來說,主要有VA-API和VDPAU兩種。
「VA-API」為Intel提出的開源影片編解碼加速技術,適用於Broadwell架構以後的Intel CPU內顯,以及Intel Arc GPU。AMD GPU的驅動亦支援VA-API。至於Nvidia GPU必須使用開源Nouveau驅動才支援VA-API,Nvidia閉源驅動不支援VA-API。
Nvidia推廣的影片編解碼加速技術叫做「VDPAU」,這個也是開源技術,僅Nvidia和AMD支援,Intel不支援。
此外,Nvidia尚推出了依賴CUDA才能使用的「NVDEC」解碼器以及「NVENC」編碼器,此乃閉源的影片編解碼加速技術。
若是Nvidia GPU要使用VA-API,還有轉譯層可以用,包括「libvdpau-va-gl」和「nvidia-vaapi-driver」,它們可以讓其他程式使用VDPAU的時候,利用VA-API當作後端加速解碼。
libvdpau-va-gl僅支援H.264影片解碼。nvidia-vaapi-driver支援大部分影片解碼,且需要CUDA才能使用。
換句話說,程式如果指定要使用VA-API的話,這倆東西還是沒啥用。
具體來說,GPU加速了什麼?
影片常見的編碼有H.264/MPEG-4 AVC 、H.265/HEVC、VP9、AV1。
影片播放的時候都是透過CPU解碼的,透過GPU加速,能夠讓這些影片解碼更為快速。
對H.264、H.265、VP9這種舊影片編碼,Intel Core七代以後CPU要解碼應該都沒有問題。
可是,最新的AV1編碼需要很新的GPU才能支援解碼。Intel Core至少需要10代以後的CPU才能透過VA-API解碼;Nvidia需要GeForce RTX30以後,AMD需要Radeon RX 6600以後才能夠透過VDPAU解碼。
至於Nvidia的專有技術NVDEC與NVENC,AV1的編解碼需要GeForce RTX30以後的GPU。
2. 你應該使用VA-API?#
縱然每家GPU廠商都有自家的影片加速技術,但是也要看應用程式願不願意支援。
從Arch Wiki提供的這張表格來看,目前Linux系統同時支援VA-API、VDPAU、NVDNC技術的應用程式只有MPV (v.0.39) 以及ffmpeg。
VLC (v.3.0) 僅支援VA-API與VDPAU解碼。
Chromium (v.133) 僅支援VA-API編解碼。
Firefox (v.135) 僅支援VA-API解碼。
這裡可以得出VA-API是支援最為廣泛的加速技術。
這篇文章只側重在講解VA-API的加速。
故,你需要搭載Intel或AMD GPU才能繼續操作。其他品牌的GPU或許得裝轉譯層才可以使用VA-API。
3. Linux安裝VA-API套件#
我測試的系統是Ubuntu 24.04。電腦GPU為Intel i5-7400的內顯Intel Graphics UHD 630。
- 要確認目前電腦使用的GPU,使用
vulkaninfo
指令確認:
sudo apt install vulkan-tools
vulkaninfo --summary
- 根據Github資料,針對Intel Graphics UHD系列的顯示晶片,安裝以下libva套件啟用VA-API支援:
sudo apt install i965-va-driver intel-media-va-driver
# 轉譯層
sudo apt install libvdpau-va-gl1 nvidia-vaapi-driver
- 確認VA-API支援狀態,使用
vainfo
指令,應該會印出驅動版本。
sudo apt install vainfo
vainfo
# 範例輸出
libva info: VA-API version 1.20.0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_20
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.20 (libva 2.12.0)
vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - 24.1.0 ()
vainfo: Supported profile and entrypoints
- 如果使用Flatpak,需要安裝
org.freedesktop.Platform.VaInfo
套件,才能查看VA-API狀態:
flatpak install org.freedesktop.Platform.VaInfo
flatpak run org.freedesktop.Platform.VaInfo
- 為了方便觀察CPU與GPU使用率,安裝htop與Intel gpu top套件
sudo apt install htop intel-gpu-tools
4. 影片播放啟用VA-API加速#
目前VA-API可能無法在Wayland工作階段使用,建議先用X11工作階段測試。
開啟終端機,執行
sudo intel_gpu_top
指令,放在一邊,等會觀察播放影片的時候,Video
使用率是否有上升。順便執行htop
,比較CPU佔用情況。Firefox (v.135) 開箱即用,無需做任何變更。
Chromium (v.133,注意是Chromium,Google Chrome不行) 需要使用以下參數啟動,才能使用VA-API加速:
chromium --enable-features=AcceleratedVideoDecodeLinuxZeroCopyGL,AcceleratedVideoDecodeLinuxGL,AcceleratedVideoEncoder
啟動之後可以按F12開啟開發人員工具,點選更多工具 → 媒體頁面,確認影片解碼器是否為VAAPI。
播放本機影片之前,可以用
mediainfo
指令確認影片編碼為何。VLC (v3.0),透過APT安裝的無法選取VA-API加速,可能是依賴的ffmpeg版本不對所致。得改用Flatpak版才可以使用VA-API。
MPV (v 0.39)需要編輯設定檔
~/.config/mpv/mpv.conf
,加入以下內容,才可以使用VA-API加速。
hwdec=auto # 也可以試試auto-safe或vaapi
我發現在雙GPU的系統上,MPV在無法使用VA-API的時候,似乎會自動fallback,尋找是否有其他GPU,改用VDPAU來做硬體加速。