ubuntuusers.de

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:

Wiki/Icons/movies.png 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:

  1. Der Grafikchip muss eine Videobeschleunigung bieten.

  2. 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)

  3. Es muss eine passende Bibliothek für die verwendete API installiert sein

  4. 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.

Diese Revision wurde am 16. August 2023 15:10 von DJKUhpisse erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Hardware, System, Multimedia, DVD, Grafikkarten, ungetestet