Wie funktioniert ein Hardware Encoder der GPU im Detail?

Natriumchlorid

Lt. Junior Grade
Registriert
Sep. 2013
Beiträge
369
Während mir der Unterschied zwischen einem Hardware und einem Software Encoder bewusst ist, stellen sich mir doch einige Fragen bzgl. der technischen Umsetzung bzw. Implementierung eines Hardware Encoders einer GPU.

Bei OBS habe ich die Möglichkeit zwischen zwei Encodertypen zu wählen: Hardware (NVEnc) und Software (x264).

So wird beim Software-Encoder der Videostream genommen und in das gewünschte Ausgabeformat (h.264), mihilfe von x264, encodiert. Das ist soweit verständlich. Hier rechnet einfach die CPU.

Beim Hardware Encoder verstehe ich bloss nicht, wie das funktioniert. Die Nvidia GPUs (beginnend ab Kepler) bringen eigene Encoder mit, welche sich über die Generationen hinweg stets verbessert haben. Während meine GT 710 bei 1080p maximal 30 fps unterstützt, schafft die GTX 1660S ohne Probleme 1440p bei 60 fps.

Nun, wenn ich einen Hardware Encoder bei OBS auswähle und die Aufnahme starte:
  • Was passiert dann im Detail in der GPU?
  • Woher weiss der Encoder in welches Dateiformat er den Stream konvertieren soll?
  • Woher weiss OBS, dass die GPU einen HW-Encoder zur Verfügung stellt?
  • Warum wird die Performance im Spiel nicht degradiert, wenn die GPU nebenbei encodiert?
  • Ist ein Hardware-Encoder gegenüber einem Software-Encoder benachteiligt?
Kann ich mir den Encoder in einer GPU wie einen ASIC für das Bitcoin-Mining vorstellen? Er kann nur diesen dedizierten Task sehr effektiv und sonst nichts weiter?
Falls ihr interessante Quellen habt, dürft ihr diese natürlich gerne verlinken. :)
 
Natriumchlorid schrieb:
Ist ein Hardware-Encoder gegenüber einem Software-Encoder benachteiligt?
Kann ich mir den Encoder in einer GPU wie einen ASIC für das Bitcoin-Mining vorstellen? Er kann nur diesen dedizierten Task sehr effektiv und sonst nichts weiter?
Ja im Prinzip das.
 
  • Gefällt mir
Reaktionen: UNDERESTIMATED und Asghan
Natriumchlorid schrieb:
Kann ich mir den Encoder in einer GPU wie einen ASIC für das Bitcoin-Mining vorstellen? Er kann nur diesen dedizierten Task sehr effektiv und sonst nichts weiter?
ja
Der Artikel koennte dich interessieren:
https://www.eetimes.com/anatomy-of-a-hardware-video-codec/
Natriumchlorid schrieb:
  • Was passiert dann im Detail in der GPU?
s.o.
Natriumchlorid schrieb:
  • Woher weiss der Encoder in welches Dateiformat er den Stream konvertieren soll?
Software mit der Entsprechenden funktion nutzt ihn. Du klickst ja den Codec in der Software an. Achtung: Dateiformat und COdec haben nicht viel mit einander zu tun
Natriumchlorid schrieb:
  • Woher weiss OBS, dass die GPU einen HW-Encoder zur Verfügung stellt?
hwinfo weiss doch auch welche GPU steckt und welche Features vorhanden / welche technischen Daten sie aht
Natriumchlorid schrieb:
  • Warum wird die Performance im Spiel nicht degradiert, wenn die GPU nebenbei encodiert?
eigenes Modul. Das hast du dir auch schon beantwortet
Natriumchlorid schrieb:
  • Ist ein Hardware-Encoder gegenüber einem Software-Encoder benachteiligt?
Kommt auf die Metrik an. Framerate? Performance? Qualität? Und so weiter..
 
  • Gefällt mir
Reaktionen: Natriumchlorid, RedIvan, ghecko und 3 andere
'Die GPU' in dem Sinne gibt es nicht.
Bzw. schon aber nicht so, wie Du Dir das eventuell denkst.
So eine Grafikkarte hat halt auch haufenweise Silikon drin und einige der Teile sind eben für das Decoding zuständig, andere (die meisten) nicht.
Es gibt ein paar Chips in einer Grafikkarte, die ausschließlich dafür da sind.
 
Natriumchlorid schrieb:
Was passiert dann im Detail in der GPU?
Die GPU hat eine separate ASIC, deren Schaltlogik nur den Berechnungen dient, die beim Encoden von Bildmaterial in einen bestimmten Codec anfällt und quasi für nichts anderes zu gebrauchen ist.
Dieser Bereich bearbeitet den Videostream recht autark und das Ergebnis wird dem System mehr oder weniger fertig zu Verfügung gestellt und von diesem dann in einen Container (zb mp4) gepackt.
Natriumchlorid schrieb:
Woher weiss der Encoder in welches Dateiformat er den Stream konvertieren soll?
Für jeden Codec, den der Encoder unterstützt gibt es in der API (nvenc) separate Aufrufe.
Natriumchlorid schrieb:
Woher weiss OBS, dass die GPU einen HW-Encoder zur Verfügung stellt?
Indem OBS das System nach der Aufrufbarkeit der APIs abklopft:
Webaufnahme_29-8-2022_141521_www.computerbase.de.jpeg

Natriumchlorid schrieb:
Warum wird die Performance im Spiel nicht degradiert, wenn die GPU nebenbei encodiert?
Weil der separate ASIC nicht Teil der Shader ist, bzw. deren Leistung für das Encoding nicht beansprucht.
Natriumchlorid schrieb:
Ist ein Hardware-Encoder gegenüber einem Software-Encoder benachteiligt?
Hardwareencoder sind sehr unflexibel und die Kompression (Bitrate im Vergleich zur Bildqualität) ist noch nicht so gut wie beim Software-Encode.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Natriumchlorid, Baal Netbeck, UNDERESTIMATED und eine weitere Person
Natriumchlorid schrieb:
  • Was passiert dann im Detail in der GPU?
  • Woher weiss der Encoder in welches Dateiformat er den Stream konvertieren soll?
  • Woher weiss OBS, dass die GPU einen HW-Encoder zur Verfügung stellt?
  • Warum wird die Performance im Spiel nicht degradiert, wenn die GPU nebenbei encodiert?
  • Ist ein Hardware-Encoder gegenüber einem Software-Encoder benachteiligt?

Hier kann man sich das mal anschauen was im Detail passiert.
Das beantwortet auch im Prinzip viele deiner Fragen.

NVENC ist ein separater Encoder-Chip der über eine API angesprochen wird. Für diese API gibt es ein Software Development Kit.

1. Siehe mein Link
2. Der Encoder bekommt das vom Softwareentwickler mitgeteil. Er kann zwischen verschiedenen Einstellungen wählen
3. Weil das SDK genutzt wurde um die API abzufragen die die Encoder-Details zurückgibt.
4. Weil es ein extra Chip ist.
5. Manche sagen dass die Qualität beim Softwareencoding besser ist als beim Hardwareencoding. Ich sehe da allerdings keine großen Unterschiede.
 
  • Gefällt mir
Reaktionen: Natriumchlorid
DocWindows schrieb:
Manche sagen dass die Qualität beim Softwareencoding besser ist als beim Hardwareencoding. Ich sehe da allerdings keine großen Unterschiede.
Das Ergebnis kann man per Software messen. Und nach wie vor gehen Hardwareencoder nicht so effizient mit der Bitrate um wie Softwareencoder. Eben weil Hardwareencoder nur recht wenige Profile abdecken können. Sonst würden sie auf dem Chip zu viel Platz einnehmen.
 
  • Gefällt mir
Reaktionen: Natriumchlorid und madmax2010
hamju63 schrieb:
'Die GPU' in dem Sinne gibt es nicht.
Bzw. schon aber nicht so, wie Du Dir das eventuell denkst.
So eine Grafikkarte hat halt auch haufenweise Silikon drin und einige der Teile sind eben für das Decoding zuständig, andere (die meisten) nicht.
Es gibt ein paar Chips in einer Grafikkarte, die ausschließlich dafür da sind.
Silikon find ich nice :D
Ergänzung ()

ghecko schrieb:
Das Ergebnis kann man per Software messen. Und nach wie vor gehen Hardwareencoder nicht so effizient mit der Bitrate um wie Softwareencoder. Eben weil Hardwareencoder nur recht wenige Profile abdecken können. Sonst würden sie auf dem Chip zu viel Platz einnehmen.
Hast du da mehr Infos zu ? Zur Messbarkeit ? Mit welchem Programm ? LG
 
  • Gefällt mir
Reaktionen: madmax2010
hamju63 schrieb:
So eine Grafikkarte hat halt auch haufenweise Silikon drin [...]
YMMD, danke dafür :D

In meiner GraKa steckt hauptsächlich Silizium (Silicon) und kein Silikon (Silicone)

Macht auch einen Unterschied ob du in Kalifornien ins Silicon- oder ins Silicone Valley abbiegst ;)
 
  • Gefällt mir
Reaktionen: madmax2010 und Asghan
washieiko schrieb:
Hast du da mehr Infos zu ? Zur Messbarkeit ? Mit welchem Programm ? LG
https://de.wikipedia.org/wiki/Video_Multi-Method_Assessment_Fusion
https://github.com/Netflix/vmaf

Ein Video mit Beispielen (Achtung, Intel-Werbung):
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: washieiko und Fortatus
ghecko schrieb:
Das Ergebnis kann man per Software messen.

Ja kann man. Messergebnisse spiegeln aber nicht unbedingt die subjektive Rezeption wider.
Man kann ja mal beides benutzen und dann entscheiden ob einem der oft kaum wahrnehmbare Qualitätsverlust stört, so dass man den Mehraufwand von Energie und Zeit in Kauf nehmen möchte.
 
  • Gefällt mir
Reaktionen: Baal Netbeck
DocWindows schrieb:
Ja kann man. Messergebnisse spiegeln aber nicht unbedingt die subjektive Rezeption wider.
Genau dafür wurde VMAF ja entwickelt :/
Um die Qualität nach menschlicher Bildwahrnehmung zu quantifizieren.
 
  • Gefällt mir
Reaktionen: madmax2010
Als Ergänzung zu dem, was @DocWindows gesagt hat: Ja, die Software-Messergebnisse entsprechen nicht immer der subjektiven Qualitätsempfindung. Allerdings sind insbesondere neuere Verfahren (vmaf) darauf ausgelegt, die menschliche Wahrnehmung der Qualität nachzuempfinden. Ältere Verfahren (z.B. PSNR) sind hingegen nicht auf das subjektive Empfinden ausgerichtet.

Das heißt natürlich nicht, dass VMAF z.B. bereits "perfekt" ist. :) Und unterschiedliche Menschen werden jeweils unterschiedliches Empfinden dafür haben, was "gute" und was "schlechte" Qualität ist. D.h. jedes Verfahren wird einen Durchschnittsmenschen annehmen und nicht perfekt objektiv sein können.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Aduasen, UNDERESTIMATED und ghecko
Meine Frau ist Fulltimestreamerin, ich kann den Qualitätsunterschied zwischen der Hardware und Softwarecodierung schon deutlich sehen bei Twitch unter 1080p bei 60 FPS. Allerdings muss man dabei auch die Ressourcenbeanspruchung beachten. Wenn ich über die CPU gehe, habe ich mit dem Ryzen 3700X in FullHD gute 50% Systemauslastung beim "besserem" Bild. Wenn ich über die GPU gehe habe ich vlt 5-10% Auslastung des Systemes, dafür aber ein maginal schlechteres Bild.

Da wird DJ Streams machen und das System nur für den Stream genutzt wird, nutze ich lieber die Softwarecodierung und nehme die maximale Bildqualität mit, spätestens aber beim Gamen + Streamen über ein System, wird die Decodierung über die GPU ein wesentlicher Faktor. Dabei konnte ich aber noch nicht ermitteln, ob das zu Lasten der FPS Ingame geht.

@ghecko danke für die links und mühe !
 
  • Gefällt mir
Reaktionen: Natriumchlorid und Aduasen
DocWindows schrieb:
Manche sagen dass die Qualität beim Softwareencoding besser ist als beim Hardwareencoding. Ich sehe da allerdings keine großen Unterschiede.
Ob der Unterschied tatsächlich sichtbar ist, hängt sehr stark von der Bitrate ab. Wenn diese so hoch ist, dass schon der "schlechtere" Codec visuell nicht mehr vom Original zu unterscheiden ist (unter bestimmten Wiedergabebedingungen), ist es für den "besseren" Codec unmöglich, noch wahrnehmbar bessere Qualität zu liefern.

washieiko schrieb:
Hast du da mehr Infos zu ? Zur Messbarkeit ? Mit welchem Programm ? LG
https://en.wikipedia.org/wiki/Video_quality
Programm bspw. ffmpeg

ghecko schrieb:
Genau dafür wurde VMAF ja entwickelt :/
Ist aber halt auch nicht perfekt, z.B. erkennt es Banding nicht (deshalb wurde dann CAMBI entwickelt).
 
  • Gefällt mir
Reaktionen: washieiko
Vielen Dank für den Lesestoff. @madmax2010 und @DocWindows :daumen:
ghecko schrieb:
Indem OBS das System nach der Aufrufbarkeit der APIs abklopft:
Probiere ich aus. Danke!
ghecko schrieb:
Hardwareencoder sind sehr unflexibel und die Kompression (Bitrate im Vergleich zur Bildqualität) ist noch nicht so gut wie beim Software-Encode.
Ich bin tatsächlich immer davon ausgegangen, dass der HW-Encoder dem SW-Encoder überlegen ist, gerade weil der HW-Encoder keine anderen Systemressourcen in Anspruch nimmt und für mich der Stream immer besser aussah.

Dann bleibt nur noch die Frage, weshalb Nvidia schon seit Generationen einen dedizierten Encoder zur Verfügung stellt, AMD jedoch nicht. Hat das offensichtliche Gründe?
 
Natriumchlorid schrieb:
Dann bleibt nur noch die Frage, weshalb Nvidia schon seit Generationen einen dedizierten Encoder zur Verfügung stellt, AMD jedoch nicht. Hat das offensichtliche Gründe?
Wie meinst du das? AMD GPUs haben doch genauso schon seit vielen Jahren einen. Nur mit wenigen ausnahmen (Rx6400 oder so) und er ist halt idR nicht so gut wie der von nvidia.
 
  • Gefällt mir
Reaktionen: Natriumchlorid
Ah, das hat sich geklärt. AMD GPUs haben tatsächlich HW-Encoder im Einsatz. :D
 
Zurück
Oben