Video-Dekodierung beschleunigen
Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:
Dieser Artikel ist mit keiner aktuell unterstützten Ubuntu-Version getestet! Bitte teste diesen Artikel für eine Ubuntu-Version, welche aktuell unterstützt wird. Dazu sind die Hinweise zum Testen von Artikeln zu beachten.
Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:
Die Video-Dekodierung ist vor allem bei hochauflösenden (HD-)Videos ein sehr rechenintensiver Prozess, bei dem schwache Prozessoren (z.B. in Netbooks) überfordert sind und auch Mittelklasse-CPUs an ihre Leistungsgrenzen bringen. Um die CPU zu entlasten und die Dekodierung von HD-Videos auf weniger gut ausgestatteten Systemen überhaupt erst zu ermöglichen, bieten moderne Grafikchips eine Hardwareunterstützung zur Videodekodierung an. Während es zu deren Nutzung auf Windows-Systemen eine einheitliche Schnittstelle gibt (DirectX), gibt es unter Linux gleich drei, denn jeder der großen Grafikkarten-Hersteller bietet hier eine eigene Lösung:
Durch verschiedene Treiber bzw. API-Bibliotheken ist es aber auch möglich, die beiden verbreiteten Lösungen VA-API und VDPAU herstellerübergreifend zu nutzen. Achtung: Unter dem Wayland/Weston Compositor, der ab Ubuntu 17.10 zumindest optional zum Einsatz kommen wird, ist nur noch eine Videobeschleunigung über VA-API möglich, aus technischer Sicht ist VDPAU daher keine Zukunftslösung.
Voraussetzungen¶
Damit Videobeschleunigung durch die Hardware genutzt werden kann, müssen mehrere Bedingungen erfüllt sein:
Der Grafikchip muss eine Videobeschleunigung bieten.
Der zugehörige Grafiktreiber muss diese unterstützen (meist sind dies nur durch die proprietären Treiber der Hersteller möglich, ab Kernel 3.13 auch mit denn freien Treiber radeon möglich)
Es muss eine passende Bibliothek für die verwendete API installiert sein
Die Videoplayer-Software muss die API unterstützen
Die Videobeschleunigung wird unter Ubuntu bisher von Haus aus leider nur sehr stiefmütterlich behandelt. Es müssen daher einige Pakete nachinstalliert und ggf. ein Personal Package Archiv (PPA) eingebunden werden.
Die API von AMD/ATI (XvBA) entspricht ziemlich genau dem DirectX-API unter Windows, was es dem Hersteller ermöglicht, für Linux im Prinzip den gleichen Grafiktreiber einzusetzen wie für Windows. Damit wird doppelter Entwicklungsaufwand vermieden und ermöglicht, zeitgleich mit der Windows-Version auch eine Linux-Version der Treiber anzubieten (AMD/ATI liefert monatlich Aktualisierungen seines fglrx-Treibers).
Die schlechte Nachricht: Die XvBA API wird unter Linux so gut wie überhaupt nicht unterstützt. Und die gute Nachricht: Es gibt eine Bibliothek, die Intels VA-API in die XvBA API umsetzt, so dass jede Software genutzt werden kann, die das VA-API unterstützt. Dadurch hat man es im Wesentlichen nur noch mit zwei APIs zu tun: VA-API und VDPAU.
Neben der Installation der benötigen Bibliotheken für die API des eigenen Systems wird auch noch ein Videoplayer benötigt, der Unterstützung für die jeweilige API nicht nur anbietet, sondern auch einkompiliert hat. Hier gibt es nur wenige Alternativen.
Videoplayer¶
VLC¶
Der VLC-Player bietet eine Unterstützung für die installierten APIs, standardmäßig wird diese automatisch ausgewählt. Die Unterstützung der APIs ist jedoch sehr eingeschränkt, denn aufgrund der Philosophie von VLC, dass Videos als Datenstrom versendet (streaming) und zu jedem beliebigen Ziel umgeleitet werden können, muss VLC die Daten nach der Dekodierung vom Grafikchip abholen und ihn anschließend (falls die Ausgabe auf den Bildschirm erfolgen soll) erneut zur Grafikkarte senden. Auf diese Weise wird kaum ein Vorteil aus der Hardwaredecodierung gewonnen, doch wird diese wenn verfügbar und auf "automatisch" gestellt aktiviert, von daher ist davon auszugehen, dass sie durchaus etwas sinnvoll ist. VLC unterstützt die VA-API und VDPAU.
Siehe auch VLC GPU Dekodierung im VLC-Wiki 🇬🇧
Kodi¶
Kodi (ehemals XBMC) ist der am besten funktionierende Videoplayer mit Hardwareunterstützung. Er bietet Unterstützung für beide APIs an. Allerdings müssen auch hier Versionen mit VA-API oder VDPAU selbst kompiliert oder aus einem PPA installiert werden.
Für VDPAU lässt sich Kodi aus dem PPA des team-xbmc installieren. VDPAU wird in dieser Version direkt ohne weitere Einstellungen unterstützt.
MPlayer¶
MPlayer bietet ebenfalls sehr gute Unterstützung für beide APIs an, muss jedoch auch selbst kompiliert werden oder aus einem PPA installiert werden, da in den offiziellen Paketquellen diese Unterstützung fehlt. MPlayer ist ein Abspielprogramm für die Kommandozeile, für den es Zusätze zur grafischen Bedienung gibt (z.B. GNOME MPlayer oder SMPlayer). SMPlayer bietet die Möglichkeit, eine selbstkompilierte Version von MPlayer zu nutzen (der Pfad zum eigentlichen Abspielprogramm ist frei konfigurierbar).
MPlayer mit VA-API Untersützung kann als Paket mplayer-vaapi aus dem PPA von Sander van Grieken installiert werden.
Bei der Verwendung des GNOME MPlayer muss als Videoausgabe "vdpau" oder "vaapi" eingestellt und ein Häkchen bei "Enable Video Hardware Support" gesetzt werden.
Mpv¶
mpv ist eine Abspaltung und Weiterentwicklung des MPlayers. Entwicklungsziele waren die bessere Unterstützung der Fähigkeiten moderner Grafikkarten (GPUs) und die Integration der beim MPlayer in das Programm MEncoder ausgelagerten Funktionen zur Erstellung und Konvertierung von Audio- und Video-Dateien.
Totem¶
Totem gibt Videos über GStreamer aus. Für GStreamer stellt das Paket gstreamer1.0-vaapi bzw. für ältere Ubuntu-Versionen gstreamer0.10-vaapi eine Ausgabe über VA-API zur Verfügung.
Browser¶
Unter Firefox ist seit Version 76 Integration für Hardwarebeschleunigung eingebaut worden, auch Chromium hat diese Funktion, allerdings gibt es hier für höhere Auflösungen Codecprobleme, denn es wird bei den meisten Websites standardmäßig der VP-9-Codec verwendet, welcher bei den meisten Grafikkarten keine Hardwarebeschleunigung möglich macht. Mit Addons kann man teilweise die Verwendung des H.264-Codecs erzwingen, welcher meistens hardwarebeschleunigt werden kann, allerdings funktioniert dieser bei den meisten Plattformen nur bis zu einer Auflösung von 1920x1080, theoretisch ginge mehr, wird wohl aber nicht unterstützt.
Vorbereitungen¶
Voraussetzung ist natürlich, dass man einen Grafikprozessor hat, der Videobeschleunigung unterstützt. Informationen, welche Grafik im System steckt, findet man im Terminal mit folgendem Befehl heraus:
lspci -nnk | grep -i VGA -A2
Das sieht dann z.B. so aus:
01:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Caicos [Radeon HD 7450A] [1002:6772] Subsystem: Lenovo Device [17aa:3623] Kernel driver in use: fglrx_pci
Jetzt muss nur noch in Erfahrung gebracht werden, ob die eingebaute Karte auch eine Videobeschleunigung besitzt. Bei AMD/ATI sollte das bei allen Modellen der Radeon-Serie der Fall sein. Für Nvidia-Karten findet man eine Auflistung in der Wikipedia und für Intel-Grafik findet man eine Übersicht in der englischen Wikipedia.
Installation¶
Systeme mit AMD/ATI-Grafik¶
Grafiktreiber¶
Der freie radeon-Treiber, der in den offiziellen Paketquellen vorhanden ist, bietet seit Kernel 3.13 (also seit Ubuntu 14.04) eine Videobeschleunigung.
Unterstützung für vdpau-radeon-Treiber¶
mesa-vdpau-drivers
libvdpau1
vdpauinfo
Befehl zum Installieren der Pakete:
sudo apt-get install mesa-vdpau-drivers libvdpau1 vdpauinfo
Oder mit apturl installieren, Link: ,vdpauinfo
Unterstützung für VA-API-radeon-Treiber¶
mesa-va-drivers
vainfo
Befehl zum Installieren der Pakete:
sudo apt-get install mesa-va-drivers vainfo
Oder mit apturl installieren, Link: apt://mesa-va-drivers,vainfo
Systeme mit Nvidia-Grafik¶
Grafiktreiber¶
Als Treiber für die Grafikkarte kommt nur der proprietäre nvidia in Frage. Der freie nouveau-Treiber bietet keine Videobeschleunigung an.
Unterstützung für VDPAU¶
Für die VDPAU-Unterstüzung werden folgende Bibliotheken benötigt [1]:
libvdpau1
vdpauinfo
Befehl zum Installieren der Pakete:
sudo apt-get install libvdpau1 vdpauinfo
Oder mit apturl installieren, Link: apt://libvdpau1,vdpauinfo
Unterstützung für VA-API¶
Soll ein Player mit VA-API verwendet werden, muss zusätzlich das Paket vdpau-va-driver installiert werden. Hierbei werden VA-API-Aufrufe in VDPAU-Aufrufe übersetzt. Das Paket ist aber nur bis Ubuntu 18.04 LTS verfügbar und wurde danach aus den Quellen entfernt.
vdpau-va-driver (VDPAU-basiertes Backend für VA-API, bis Ubuntu 18.04)
vainfo
Befehl zum Installieren der Pakete:
sudo apt-get install vdpau-va-driver vainfo
Oder mit apturl installieren, Link: apt://vdpau-va-driver,vainfo
Systeme mit Intel-Grafik¶
Grafiktreiber¶
Der native, standardmäßig verwendete Linux-Treiber ermöglicht grundsätzlich Videobeschleunigung.
Unterstützung für VA-API¶
Für die Unterstützung der VA-API auf Intel Grafikchipsätzen werden folgende Pakete benötigt:
i965-va-driver
vainfo
Befehl zum Installieren der Pakete:
sudo apt-get install i965-va-driver vainfo
Oder mit apturl installieren, Link: apt://i965-va-driver,vainfo
Unterstützung für VDPAU¶
Mittels der generischen API-Bibliothek libvdpau-va-gl ist es auch auf Intel Grafikchipsätzen möglich, VDPAU zu nutzen. Intern baut diese auf VA-API und OpenGL auf. Zur Verwendung müssen folgende Pakete installiert werden:
libvdpau-va-gl1
i965-va-driver
vdpauinfo
Befehl zum Installieren der Pakete:
sudo apt-get install libvdpau-va-gl1 i965-va-driver vdpauinfo
Oder mit apturl installieren, Link: apt://libvdpau-va-gl1,i965-va-driver,vdpauinfo
Um VDPAU-Unterstützung für ein einzelnes Programm zu aktivieren, muss das Programm mit einem speziellen Prefix gestartet werden. Für den Firefox Browser ist z.B. folgender Befehl zu verwenden:
VDPAU_DRIVER=va_gl firefox
Möchte man VDPAU hingegen systemweit nutzen, so muss eine Umgebungsvariable gesetzt werden. Dann ist die Nutzung des Prefix beim Aufruf von einzelnen Programmen nicht notwendig, und VDPAU steht generell allen Programmen zur Verfügung. Die Umgebungsvariable kann über folgenden Befehl gesetzt werden:
sudo sh -c "echo 'export VDPAU_DRIVER=va_gl' >> /etc/profile"
Um diese Änderung wirksam zu machen, muss der Rechner anschließend neu gestartet werden.
Test¶
Test der Unterstützung für VA-API¶
Hat man die Bibliotheken für das VA-API installiert, so lässt sich im Terminal mit dem Befehl vainfo
prüfen, ob die Hardwarebeschleunigung erkannt wird. Beispiel einer AMD/ATI-Grafikarte mit xvba-va-driver:
vainfo
libva: VA-API version 0.32.0 Xlib: extension "XFree86-DRI" missing on display ":0". libva: va_getDriverName() returns 0 libva: Trying to open /usr/lib/x86_64-linux-gnu/dri/fglrx_drv_video.so libva: va_openDriver() returns 0 vainfo: VA-API version: 0.32 (libva 1.0.15) vainfo: Driver version: Splitted-Desktop Systems XvBA backend for VA-API - 0.7.8 vainfo: Supported profile and entrypoints VAProfileH264High : VAEntrypointVLD VAProfileVC1Advanced : VAEntrypointVLD
Dieses Beispiel zeigt, dass die Unterstützung korrekt erkannt wurde und dass die verbaute Grafikkarte zwei Videoprofile beherrscht: H.264 High und VC1 Advanced. Konkret handelt es sich um ein Netbook mit einer ATI-Radeon-HD-4225-Grafikkarte. Hier sieht man auch gleich einen Nachteil von AMD/ATI-Grafikprozessoren: Diese beherrschen (im Gegensatz zu Nvidia) keine MPEG2-Dekodierung (notwendig bei Videos von DVD oder DVB-S/T/C).
Beispiel eines Intel-Grafikprozessors (Intel HD 4400) mit i965-va-driver:
vainfo
libva info: VA-API version 0.35.0 libva info: va_getDriverName() returns 0 libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so libva info: Found init function __vaDriverInit_0_35 libva info: va_openDriver() returns 0 vainfo: VA-API version: 0.35 (libva 1.3.0) vainfo: Driver version: Intel i965 driver - 1.3.0 vainfo: Supported profile and entrypoints VAProfileMPEG2Simple : VAEntrypointVLD VAProfileMPEG2Simple : VAEntrypointEncSlice VAProfileMPEG2Main : VAEntrypointVLD VAProfileMPEG2Main : VAEntrypointEncSlice VAProfileH264ConstrainedBaseline: VAEntrypointVLD VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice VAProfileH264Main : VAEntrypointVLD VAProfileH264Main : VAEntrypointEncSlice VAProfileH264High : VAEntrypointVLD VAProfileH264High : VAEntrypointEncSlice VAProfileVC1Simple : VAEntrypointVLD VAProfileVC1Main : VAEntrypointVLD VAProfileVC1Advanced : VAEntrypointVLD VAProfileNone : VAEntrypointVideoProc VAProfileJPEGBaseline : VAEntrypointVLD
Ausgabe, wenn VA-API nicht aktiv ist (am Beispiel einer NVIDIA-Karte mit fehlendem Backend):
libva info: VA-API version 1.7.0 libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/nvidia_drv_video.so libva info: va_openDriver() returns -1 vaInitialize failed with error code -1 (unknown libva error),exit
Test der Unterstützung für VDPAU¶
Das Programm vdpauinfo
(im Terminal aufrufen) zeigt, welche Codecs die Grafikkarte unterstützt.
Beispiel einer NVidia-Grafikkarte mit libvdpau1
:
vdpauinfo
display: :0 screen: 0 API version: 1 Information string: NVIDIA VDPAU Driver Shared Library 304.88 Wed Mar 27 14:49:27 PDT 2013 Video surface: name width height types ------------------------------------------- 420 4096 4096 NV12 YV12 422 4096 4096 UYVY YUYV Decoder capabilities: name level macbs width height ------------------------------------------- MPEG1 0 8192 2048 2048 MPEG2_SIMPLE 3 8192 2048 2048 MPEG2_MAIN 3 8192 2048 2048 H264_MAIN 41 8192 2048 2048 H264_HIGH 41 8192 2048 2048 VC1_SIMPLE 1 8190 2048 2048 VC1_MAIN 2 8190 2048 2048 VC1_ADVANCED 4 8190 2048 2048 MPEG4_PART2_SP 3 8192 2048 2048 MPEG4_PART2_ASP 5 8192 2048 2048 DIVX4_QMOBILE 0 8192 2048 2048 DIVX4_MOBILE 0 8192 2048 2048 DIVX4_HOME_THEATER 0 8192 2048 2048 DIVX4_HD_1080P 0 8192 2048 2048 DIVX5_QMOBILE 0 8192 2048 2048 DIVX5_MOBILE 0 8192 2048 2048 DIVX5_HOME_THEATER 0 8192 2048 2048 DIVX5_HD_1080P 0 8192 2048 2048 Output surface: name width height nat types ---------------------------------------------------- B8G8R8A8 16384 16384 y Y8U8V8A8 V8U8Y8A8 R10G10B10A2 16384 16384 y Y8U8V8A8 V8U8Y8A8 Bitmap surface: name width height ------------------------------ B8G8R8A8 16384 16384 R8G8B8A8 16384 16384 R10G10B10A2 16384 16384 B10G10R10A2 16384 16384 A8 16384 16384 Video mixer: feature name sup ------------------------------------ DEINTERLACE_TEMPORAL y DEINTERLACE_TEMPORAL_SPATIAL y INVERSE_TELECINE y NOISE_REDUCTION y SHARPNESS y LUMA_KEY y HIGH QUALITY SCALING - L1 y HIGH QUALITY SCALING - L2 - HIGH QUALITY SCALING - L3 - HIGH QUALITY SCALING - L4 - HIGH QUALITY SCALING - L5 - HIGH QUALITY SCALING - L6 - HIGH QUALITY SCALING - L7 - HIGH QUALITY SCALING - L8 - HIGH QUALITY SCALING - L9 - parameter name sup min max ----------------------------------------------------- VIDEO_SURFACE_WIDTH y 1 4096 VIDEO_SURFACE_HEIGHT y 1 4096 CHROMA_TYPE y LAYERS y 0 4 attribute name sup min max ----------------------------------------------------- BACKGROUND_COLOR y CSC_MATRIX y NOISE_REDUCTION_LEVEL y 0.00 1.00 SHARPNESS_LEVEL y -1.00 1.00 LUMA_KEY_MIN_LUMA y LUMA_KEY_MAX_LUMA y
Wird VDPAU auf einem Intel-System mit libvdpau-va-gl1
ohne systemweiter Aktivierung (sprich ohne gesetzter Umgebungsvariable) genutzt, so ist zu beachten, dass auch vdpauinfo
mit dem Prefix gestartet werden muss:
VDPAU_DRIVER=va_gl vdpauinfo
Ob die Bemühungen von Erfolg gekrönt waren, lässt sich sehr schön mit einem Youtube Testvideo 🇬🇧 prüfen. Zu beachten ist hierbei, dass die Videobeschleunigung den Codec H.264 unterstützen muss. Mit einem entsprechenden Programm lässt es sich in unterschiedlichen Auflösungen bis hin zu Full-HD herunterladen. Hat man in einem zweiten Fenster die Systemüberwachung geöffnet, kann man an der CPU-Auslastung sehen, wieviel die Videobeschleunigung leistet. Die Auslastung sollte bei Full-HD weniger als 10% betragen, wenn man einen moderner Rechner mit Mehrkernprozessor einsetzt. Eine Intel-Atom-CPU erreicht deutlich höhere Auslastung und spielt Full-HD ohne Beschleunigung überhaupt nicht ab.
Links¶
Grafikkarten Übersichtsartikel
Hardware_video_acceleration - Hardware-Videobeschleunigung im ArchWiki