11/2017

Ffmpeg mit Hardwarebeschleunigung Software Fast Motion Ffmpeg mit GPUs Ffmpeg

54 Videos verarbeiten stellt Benutzer meist vor eine harte Geduldsprobe, selbst wenn der eingesetzte Rechner über eine schnelle CPU und viel Arbeitsspeicher verfügt. Mit dem nötigen Wissen und der passenden Hardware

macht er dem Prozess jedoch über die Hardwarebeschleunigung der Grafikkarte Beine. Konstantin Agouros www.-magazin.de

des Containertyps. Für Matroska-Contai- ner (».mkv«) greift sie etwa zu x264 als Standardcodec für den Videostream.

Turbogang einlegen

Um dem Prozess Beine zu machen, setzt Ffmpeg auf die Option »‑hwaccel«, die als Argument die Art der Beschleunigung mitnimmt. Wer allein »‑hwaccels« eingibt (mit einem „s“ am Ende), dem präsen- tiert Ffmpeg eine Liste der einkompilier- ten Methoden (Listing 1). Die Webseite unter [3] erklärt die Metho- den, die sich jeweils als Schlüsselwörter für die »‑hwaccel«-Option eignen. Listing © guijunpeng, 123RF 1 zeigt die Ausgabe des unter Ubuntu 16.04 gelieferten Ffmpeg, das nur Vdpau ­ unterstützt. Das steht für „Video Decode Ffmpeg [1] ist wohl eines der am weites- ter zu speichern. Der Nachteil: Abhän- and Presentation API for Unix“ [4] und ten verbreiteten Werkzeuge, um Videoda- gig von der Einstellung funktioniert die stammt von . Es soll in erster Li- teien zu manipulieren. Die Bibliotheken Kompression nicht mehr verlustfrei und nie komprimierte Videoformate auf der des Projekts kommen in diversen grafi- wird unter Umständen beim Anschauen Grafikkarte dekodieren und diese für das schen Frontends zum Einsatz. Hardware- sichtbar. Abspielen von Videos einspannen. seitig helfen meist Grafikkarten bei der Kommen keine Transformationen wie Videoverarbeitung – zumindest beim Größenumwandlungen oder Filter zum Vdpau Dekodieren. Mit den richtigen Optionen Einsatz, wandelt Ffmpeg Videos um, in- und der passenden Hardware erzielen dem es Video- und Audioströme liest, Logisch funktioniert Vdpau so, dass die sie in bestimmen Fällen dramatische dekodiert und dann wieder enkodiert. Libav die komprimierten Videoframes Leistungssteigerungen. Der Artikel de- Ffmpeg­ ist dabei schlau genug, sich gleich an die GPU schickt, die diese dekodiert. monstriert, wie Anwender Ffmpeg mit auf mehrere CPUs zu stützen, wenn diese Mit Hilfe des Vdpau-API holt nicht Ffm- der Hardwarebeschleunigung verheiraten vorhanden sind. Der Parameter »‑threads peg selbst, sondern die darüberliegende und wann das überhaupt Sinn ergibt. X« erlaubt es dem Benutzer dabei, die Video-Anwendung (etwa VLC) die ausge- Anzahl der parallel arbeitenden Threads packten Daten ab. Der Klassiker mit CPU (und damit der genutzten CPUs) selbst Ähnlich wie bei X11 gibt es auch für festzulegen. Vdpau­ Treiber, die das API auf die kon- Videokameras oder digitale Videorecor- Im einfachsten Fall konvertiert der An- krete Hardware abbilden. Unter Ubuntu der wie TV-Headend [2] nehmen Videos wender ein Video mit dem Befehl: finden sich etwa im Paket »‑vd- in einem Format wie Mpeg 2 entgegen, pau‑drivers« Treiber für den freien Nou- ‑i Quelldatei Zieldatei.format um sie dann in ein Containerformat wie veau-, aber auch für den freien »radeon«- MP4 oder MKV zu verpacken. Video­ Ffmpeg erkennt das richtige Format in Treiber (AMD). Vdpau unterstützt dabei codecs wie H.264 oder das neuere H.265 der Regel automatisch. Die Codecs für die Codecs H.264, Mpeg 1, ​2, ​4 sowie VC erlauben es, Dateien wesentlich effizien- das Ziel wählt die Software dabei anhand 1, wobei auch eine Rolle spielt, welche 11/2017 Software Auch hier reden bestimmte Treiber mit der Hardware. Der i965-Treiber ist quell­ offen, ihn gibt es als fertiges Paket, das bei Ubuntu und Debian »i965‑va‑driver« heißt. Alternativ existiert noch der auf

der proprietären MFX-Bibliothek von mit GPUs Ffmpeg basierende iHD-Treiber, der in be- stimmten Fällen etwas bessere Ergebnisse 55 beim Enkodieren erzielen soll. Auf dem zweiten Testlaptop war neben einer durchschnittlichen Nvidia-Karte

(Geforce GTX 950M) auch ein Intel- www.linux-magazin.de Grafikchip (in der CPU) integriert. Der Ffmpeg-Aufruf mit VA-API-Support muss in diesem Fall gezielt die richtige Grafik- karte ansprechen:

ffmpeg ‑hwaccel vaapi ‑hwaccel_output_U Abbildung 1: Die verschiedenen Tests zeigen: Mit Cuvid und Nvenc klappt das Transkodieren am schnellsten, format vaapi ‑hwaccel_device U mit Software-Enconding (CPU) dauert es am längsten. /dev/dri/renderD129 ‑i Testvideo.MPG U ‑:v h264_vaapi Testvideo‑Intel.mkv Codecs die verbaute Grafikkarte unter- Für die Grafikchips von Intel spielt die stützt. Ein Aufruf für Ffmpeg sieht dann Generation des Chips eine ausschlagge- Im Gegensatz zur Umwandlung mit der wie folgt aus: bende Rolle für den VA-API-Support. Sie CPU dauerte der Lauf hier nur 13 Se- bestimmt darüber, welche Funktionen kunden (Vergleich in Abbildung 1). Auch ffmpeg ‑hwaccel vdpau ‑i Testvideo.MPG U und Codecs der Chip unterstützt. Der die Option »‑preset slow« beeinflusste die Testvideo.mkv Marketingname, unter dem diese Funkti- Laufzeit nur minimal. Sie sorgt dafür, Auf dem Rechner des Autors mit einer onen bei Intel laufen, lautet „Intel Quick dass Ffmpeg Videos sorgfältiger, aber sehr alten Radeon-Karte (Radeon HD Sync Video“. auch langsamer kodiert. Das führt zu 4250) lieferte der Befehl nur ein Viertel der Performance, den eine reine CPU- Listing 1: Hardwarebeschleunigung in Ffmpeg

Kodierung bringt. Um zu funktionieren, 01 #> ffmpeg ‑hwaccels benötigt Vdpau zugleich einen laufenden 02 ffmpeg version 2.8.11‑0ubuntu0.16.04.1 Copyright (c) 2000‑2017 the FFmpeg developers X-Server, da das System über diesen auf 03 built with gcc 5.4.0 (Ubuntu 5.4.0‑6ubuntu1~16.04.4) 20160609 die Grafikkarte zugreift. 04 configuration: ‑‑prefix=/usr ‑‑extra‑version=0ubuntu0.16.04.1 ‑‑build‑suffix=‑ffmpeg

‑‑toolchain=hardened ‑‑libdir=/usr/lib/x86_64‑linux‑gnu ‑‑incdir=/usr/include/x86_64‑linux‑gnu VA-API ‑‑cc=cc ‑‑cxx=g++ ‑‑enable‑gpl ‑‑enable‑shared ‑‑disable‑stripping ‑‑disable‑decoder=libopenjpeg ‑‑disable‑decoder=libschroedinger ‑‑enable‑avresample ‑‑enable‑avisynth ‑‑enable‑gnutls Die zweite Option zur Grafikbeschleuni- ‑‑enable‑ladspa ‑‑enable‑libass ‑‑enable‑libbluray ‑‑enable‑libbs2b ‑‑enable‑libcaca ‑‑enable‑libcdio gung liefert VA-API (Video Acceleration ‑‑enable‑libflite ‑‑enable‑libfontconfig ‑‑enable‑libfreetype ‑‑enable‑libfribidi ‑‑enable‑libgme API, [5]). Intel hat es für seine GMA- ‑‑enable‑libgsm ‑‑enable‑libmodplug ‑‑enable‑libmp3lame ‑‑enable‑libopenjpeg ‑‑enable‑libopus GPUs entwickelt. Es funktioniert ähnlich ‑‑enable‑libpulse ‑‑enable‑librtmp ‑‑enable‑libschroedinger ‑‑enable‑libshine ‑‑enable‑libsnappy wie Vdpau, auch hier kommen wieder ‑‑enable‑libsoxr ‑‑enable‑libspeex ‑‑enable‑libssh ‑‑enable‑libtheora ‑‑enable‑libtwolame Treiber zum Zug. Die Bibliothek unter- ‑‑enable‑libvorbis ‑‑enable‑libvpx ‑‑enable‑libwavpack ‑‑enable‑libwebp ‑‑enable‑libx265 stützt AMD-GPUs über die Schnittstellen ‑‑enable‑libxvid ‑‑enable‑libzvbi ‑‑enable‑openal ‑‑enable‑ ‑‑enable‑x11grab ‑‑enable‑libdc1394 UVD () und VCE ‑‑enable‑libiec61883 ‑‑enable‑libzmq ‑‑enable‑frei0r ‑‑enable‑libx264 ‑‑enable‑libopencv (Video Coding Engine). Das Dekodieren 05  libavutil 54. 31.100 / 54. 31.100 gelingt mit GPUs mit Graphics Core Next 06  libavcodec 56. 60.100 / 56. 60.100 (GCN) und deren Nachfolgern. Dabei be- 07  libavformat 56. 40.101 / 56. 40.101 herrschen die Karten dieselben Algorith- 08  libavdevice 56. 4.100 / 56. 4.100 men wie Vdpau. 09  libavfilter 5. 40.101 / 5. 40.101 Karten ab GCN 3 unterstützen dann auch 10  libavresample 2. 1. 0 / 2. 1. 0 den recht Ressourcen-intensiven Codec 11  libswscale 3. 1.101 / 3. 1.101 H.265, der zum Beispiel in Deutschland 12  libswresample 1. 2.101 / 1. 2.101 bei DVB-T2 zum Einsatz kommt. Das 13  libpostproc 53. 3.100 / 53. 3.100 Einpacken der Daten beherrschen GPUs 14 Hardware acceleration methods: von AMD nur für H.264 (abhängig vom 15 vdpau Modell der Grafikkarte). 11/2017 Software deutlich besseren Ergebnissen und weni- ger Fragmenten im Bild.

Ffmpeg mit Cuda

Ffmpeg mit GPUs Ffmpeg Mit dem Cuda-SDK öffnete Nvidia Ent- wicklern schon sehr früh eine Tür, um 56 die Rechenpower ihrer Grafikkarten für andere Zwecke zu nutzen. Selbst das Knacken von WLAN-Passwörtern gelingt mit Hilfe der richtigen GPU und dem

www.linux-magazin.de Cuda-SDK deutlich schneller. Entsprechend unterstützt auch Ffmpeg Cuda, kompiliert es in der Regel aber nicht mit ein. Ein Grund könnte sein, dass Cuda, wie alle Applikationen, die es verwenden, den proprietären Nvidia- Treiber voraussetzt. Abbildung 2: Auf der getesteten alten Grafikkarte fehlte der Support für H.265. Laut Recherche für den Artikel braucht das aktuelle Ffmpeg aus dem Git-Repo- Danach installiert der Admin die Pakete sem Wege rund 4,5-mal schneller (laut sitory den Nvidia-Treiber, momentan »nvidia‑384«, »nvidia‑384‑dev«, »lib- Ffmpeg 4,36-mal) ablief, als das ganze ab Version 3.82. Wer ihn installieren cuda1‑284« und »nvidia‑‑dev«. 5-minütige Video zum Abspielen in Echt- möchte, findet auf Nvidias Webseite Da es kein einzelnes Nvidia-Paket gibt, zeit gebraucht hätte. Mit »‑preset slow« eine Anleitung zum Thema [6]. Unter das der Admin einfach per »apt‑get up- dauerte das Umwandeln zwar 1,42 Mi- Ubuntu genügt das Hinzufügen des PPA date« auf den neuesten Stand bringt, nuten, gelang aber immer noch dreimal »graphics‑drivers/ppa« über folgenden sondern neue Nvidia-Treiber stets neue schneller. Eintrag: Paketnamen tragen (mit der Versions- Übernimmt die Grafikkarte das Enkodie- add‑apt‑repository ppa:graphics‑drivers/ppa` nummer), muss er diese manuell aktua- ren, ist der folgende Aufruf notwendig: lisieren [7]. Im nächsten Schritt klont er ./ffmpeg ‑c:v h264_nvenc nvenc‑plain.mkv Listing 2: Nvidia-Support für die aktuelle Version von Ffmpeg aus dem Ffmpeg Git-Repository: Danach wandelt Ffmpeg das Video in

01 ./configure ‑‑enable‑cuda \ nur 14 Sekunden um – was etwa einem git clone https://github.com/ffmpeg/FFMPeg 02  ‑‑enable‑cuvid \ 21stel der Laufzeit des Videos entspricht. 03  ‑‑enable‑nvenc \ Beim Aufruf von »./configure« gehören Mit dem Parameter »‑preset slow« dauert 04  ‑‑enable‑nonfree \ »nvenc« und »cuvid« in die Liste der ak- es ebenfalls nur 14 Sekunden. 05  ‑‑enable‑libnpp \ tivierten Abhängigkeiten, womit auch sie Die optimale Leistung erzielt Ffmpeg 06  ‑‑enable‑opengl \ in der erzeugten Binärdatei landen. aber, wenn die Grafikkarte auch das De- 07  ‑‑enable‑vaapi \ Um auch alle anderen wichtige Algorith- kodieren übernimmt: 08  ‑‑enable‑vdpau \ men einzubinden, verwendete der Au- ./ffmpeg ‑hwaccel cuvid ‑c:v mpeg2_cuvid U 09  ‑‑enable‑libvorbis \ tor die »./configure«-Zeile aus Listing ‑i ../Testvideo.MPG ‑c:v h264_nvenc U 10  ‑‑enable‑libmp3lame \ 2. Die letzten Algorithmen sind nur der cuvid‑nvenc‑plain.mkv 11  ‑‑enable‑libx264 \ Vollständigkeit halber mit von der Partie, 12  ‑‑enable‑libx265 \ damit das selbst kompilierte Ffmpeg mit Den Parameter nach dem ersten »‑c:v« 13  ‑‑enable‑gpl dem von Ubuntu vorgebauten vergleich- wählt der Benutzer abhängig vom Video- bar ist. Ein schlichtes »make« löst die codec der Quelldatei, der Befehl »ffprobe Listing 3: Konfiguration für den Übersetzung aus, die Ergebnisdatei lan- Testvideo.MPG« gibt diese Informationen Raspberry Pi det direkt im Source-Verzeichnis. aus. Tippt der Admin dann »ffmpeg ‑de-

01 ./configure ‑‑arch=armel \ Um sie zu testen, kam eine fünfminü- coders | grep cuvid« ein, zeigt das die un-

02  ‑‑target‑os=linux \ tige Aufnahme aus einer Videokamera terstützten Hardware-Dekoder. Am Ende

03  ‑‑enable‑gpl \ im Mpeg-2-Format zum Einsatz. Auf dem dauerte das Konvertieren des Testfilms Testlaptop, der eine i5-Quadcore-CPU mit 8 Sekunden (37-mal schneller) sowie 11 04  ‑‑enable‑omx \ 2,8 GHz nutzt, dauerte das Transkodieren Sekunden (27-mal schneller) beim »‑pre- 05  ‑‑enable‑omx‑rpi \ der Testdatei mit dem Aufruf set slow«. Und das, obwohl die in der 06  ‑‑enable‑mmal \ Testmaschine verbaute Grafikkarte nicht 07  ‑‑enable‑nonfree \ ./ffmpeg ‑i Testvideo.mpg Testvideo.mkv gerade als Highend-Modell gilt. 08  ‑‑enable‑libmp3lame \ 1 Minute und 8 Sekunden. Das heißt, Neuere Karten liefern auch Support für 09  ‑‑enable‑libx264 dass das Umwandeln mit Ffmpeg auf die- das De- und Enkodieren von H.265/​ 11/2017 Software HEVC. Der Versuch mit dem alten Mo- Der relative Performance-Unterschied Die Feineinstellungen sollten Admins dell führte zum Ergebnis in Abbildung 2. auf dem Raspberry Pi 1 des Autors war aber auf Herz und Nieren prüfen, da die gewaltig: Brauchte die Software-Enkodie- Hardwarekodierer Videos in schlechterer Raspberry Pi rung 40-mal mehr Zeit, als der Film lang Qualität erzeugen. Hier gilt es, zunächst war (Faktor 0,025), lag der Faktor mit etwas Videomaterial umzuwandeln und

Auch der Raspberry Pi bringt auf seinem Beschleunigung nur noch bei 0,65 und anzuschauen. Bei Videos in niedriger mit GPUs Ffmpeg SoC Hardware-Unterstützung für einige arbeitete Ffmpeg 26-mal schneller. Auflösung fällt es womöglich nicht so Algorithmen mit. Fehlen die, wird das Auf dem Raspberry Pi 3 fiel der Sprung schnell auf, aber Videos mit hoher Auflö- 57 Abspielen von Videos schwierig. Auch nicht ganz so gewaltig aus, da hier vier sung (Full HD) und viel Bewegung (etwa hier muss der User Ffmpeg selber über- Kerne an der Datei arbeiten. Die Soft- bei Sportveranstaltungen) zeigen unter setzen und die Optionen (»‑‑enable‑omx«, warevariante brachte es hier auf den Umständen Fragmente. (kki) n

»‑‑enable‑omx‑rpi«) aktivieren. Der Pi de- Faktor 0,2, während die beschleunigte www.linux-magazin.de kodiert auch einige Codecs in Hardware, Variante auf den Faktor 1,4 kam, also braucht dafür bei Mpeg 2 aber eine Li- knapp 7-mal schneller arbeitete als mit Infos zenz, die extra zu beschaffen ist. Für den dem Software-Enkoder. [1] Ffmpeg: [http://​­www.​­ffmpeg.​­org] Test konfigurierte der Autor Ffmpeg mit Beim Raspberry Pi sollte der Admin noch [2] TV-Headend: [http://​­tvheadend.​­org] den Optionen aus Listing 3. Raspbian beachten, den GPU-Speicher über die Op- [3] Ffmpeg und Hardwarebeschleunigung: verlangte noch nach den Paketen »libm- tion »gpu_mem« in der Datei »/boot/con- [https://​­trac.​­ffmpeg.​­org/​­wiki/​ p3lame‑dev« und »libx264‑dev«. fig.txt« nicht zu niedrig einzustellen (ein ­HWAccelIntro] Der Aufruf zum Transkodieren des Test- Forumseintrag sprach von mindestens [4] Vdpau: [https://www.freedesktop.org/wiki/ videos mit Hardwaresupport lautet dann: 128 MByte), damit der Encoder arbei- Software/VDPAU/] ten kann. Zudem kann die GPU nur im [5] VA-API: [https://01.org/linuxmedia/vaapi] ./ffmpeg ‑i ~/Testvideo.MPG ‑c:v h264_omx U H.264-Format kodieren. [6] Nvidias Ffmpeg-Seiten: Testvideo.MKV [https://​­developer.nvidia.​­ ​­com/​­ffmpeg] Will der Admin (bei vorhandener Lizenz) Fazit [7] Allgemeines zu Nvidia und Videoverar- auch die Hardwaredekodierung verwen- beitung: [https://​­developer.​­nvidia.​­com/​ den, nutzt er den folgenden Aufruf: Wer häufiger Videodateien von einem ­nvidia‑video‑codec‑sdk] in einen anderen Codec umwandeln ./ffmpeg ‑c:v mpeg2_mmal ‑i ~/Testvideo.MPGU möchte, kann mit der passenden Gra- Der Autor ‑c:v h264_omx Testvideo.MKV fikkarte und den richtigen Treibern viel Konstantin Agouros arbeitet als Head of Open Wie schon bei den Nvidia-Treibern muss Zeit sparen. Die Karten unterstützen auch Source Projects bei der Matrix Technology AG der Admin hier manuell den richtigen Video-Effekte und Hardware-basiertes und berät dort mit seinem Team Kunden zu Open- Hardwaredekodierer passend zur vorlie- Umskalieren von Videos, die HW-Accel- Source- und Cloud-Themen. Sein Buch „Software genden Datei auswählen, wobei »h264_ Webseiten von Ffmpeg [3] zeigen einige Defined Networking: Praxis mit Controllern und mmal« auch ohne Lizenz funktioniert. Beispiele hierfür. OpenFlow“ ist bei de Gruyter erschienen.