OBS Studio - Mit NVENC effizient aufnehmen

Ich brauche deine Hilfe, um den Fortbestand des LetsPlayForums zu sichern: Mehr Informationen findest du hier!
  • Diese Anleitung bezieht sich auf eine Aufnahmemethode die De-M-oN immer wieder für Capture Karten mit FFMPEG Empfohlen hat, die mittlerweile durch ein Drittanbieter Plugin auch in OBS Studio mit NVIDIA Karten möglich ist und bei mir sehr gute Ergebnisse erzielt. Dies ist keine Anleitung für die Verwendung oder Standardkonfiguration von OBS Studio.


    Im wesentlichen geht es darum, dass man neben einen festen Quantizer in NVENC auch einen minimalen und maximalen Quantizer angeben kann, wodurch z.B dunkle Szenen in Aufnahmen viel bessere Qualität erzielen, ohne wirklich viel mehr Performance oder Speicher zu kosten (Da diese Szenen sehr gut komprimierbar sind). Dazu zitiere ich am besten einmal De-M-oN, da dieser sich um einiges besser mit encoding auskennt:

    Das Problem ist halt das OBS keine qmin, qmax Kombo anbietet wie ffmpeg es tut.

    Dadurch leidet Dunkelheit relativ schnell, weil die ja dann auch mit 16 quantisiert wird. qmin würde dann die Dunkelheit kleinere Quantizer geben (zumal die eh gut komprimierbar ist) und dann würde man sogar mit CQP19 auskommen, bissl puffer für re-encode schadet aber nicht und 16 ist dann schon ein sehr guter Weg.

    Aber da OBS diese kombo nicht hat, würd ich bei OBS eher zu CQP10 raten. Dann brauchts bei 4k/UHD aber schon recht gute Schreibrate.

    Zusammengefasst

    Mit OBS-Studio hat man also das Problem, dass man nur einen festen Quantizer angeben kann (Wenn man für die Aufnahme: CQP verwendet) z.B CQP 16

    Kleine Quantizer z.B QCP 1 = Hohe Qualität/Bitrate

    Großer Quantizer z.B QCP 25 = Niedrige Qualität/Bitrate

    In FFMPEG wird dies durch qmin und qmax gelöst, wodurch ein dynamischer Quantizer erreicht wird, der also nicht nur einen festen CQP Wert verwendet.

    Lösung durch StreamFX Plugin

    Damit wir jetzt auch diese qmin und qmax Kombination für einen dynmaischen Quantizer in OBS-Studio verwenden können, müssen wir uns das Plugin StreamFX, welches weitere Encoder für OBS enthält, von Xaymar (Ein deutscher Entwickler, der sehr aktiv an der Entwicklung von OBS-Studio beteiligt ist) herunterladen. Zuvor war StreamFX in zwei unterschiedlichen Plugins aufgesplittet: Stream effekte und FFMPEG Encoder. Zur Vereinfachung von Updates wurde beides in ein Projekt zusammengeführt.

    StreamFX download: https://github.com/Xaymar/obs-StreamFX/releases/latest


    Für den Download nach ganz unten unter "Assets" scrollen und die Version mit den Dateinamen ".exe" herunterladen.

    Das Setup kann normal ausgeführt werden und installiert das Plugin StreamFX in eure aktuelle OBS Studio Version. Das Plugin kann über die Windows Systemsteuerung auch einfach wieder deinstalliert werden.

    OBS Studio Konfiguration

    Für die Konfiguration des dynmaischen Quantizer geht ihr als erstes in OBS Studio oben links auf:

    Datei > Einstellungen > Ausgabe > Ausgabemodus: Erweitert > Reiter: Aufnahme.

    Oben könnt ihr eure Standardeinstellung wie den Pfad, Format und Audiotracks definieren.


    Wichtig ist, dass Ihr als Kodierer folgendes vom StreamFX Plugin auswählt:

    H.264/AVC Nvidia NVENC

    StreamFX Konfiguration

    Sobald der Kodierer ausgewählt wurde, kann in den Aufnahmeeinstellungen vieles für die H.264 Nvidia NVENC Aufnahme konfiguriert werden. Die Konfiguration wird auf eine hohe Performance mit den dynamischen Quantizer konfiguriert.

    Einstellungen die nicht genannt werden, sind auf den Standard belassen, befinden sich aber noch mal unter den Button "Alle Einstellungen":

    • Preset: High Performance
    • Profile: Main
    • Mode: Variable Bitrate
    • Buffer Size: 0 kbit/s
    • Target Bitrate: 0 kbit/s
    • Maximum Bitrate: 0 kbit/s
    • Target Quality: 0,00
    • Minimum Quality: -1
    • Maximium Quality: -1
    • Interval Type: Seconds
    • Interval: 2,00 seconds
    • Custom Settings: -b=0 -maxrate=0 -bufsize=0 -qmin=1 -qmax=16

    Am wichtigsten sind die Custom Settings, welche FFMPEG Parameter zulassen und Einstellungen in der Graphischen Oberfläche überschreiben. Hier definieren wir also den dynmaischen Quantizer, welcher für euren Bedarf angepasst werden kann. Es sollte nur -qmin und -qmax angepasst werden, da die anderen Werte in den genannten "Custom Settings" für die Methode auf 0 stehen müssen.

    Empfohlene qmin und qmax Einstellungen

    -qmin=1 und -qmax=16 wird für eine Aufnahme in [email protected] empfohlen, da die Bitraten für normale Festplatten tragbar sein sollten. Falls die Festplattengeschwindigkeit nicht ausreichen sollte, muss der -qmax Wert angehoben werden. Hier aber am besten nicht über 20 gehen, da die Qualität sonst leiden könnte (Am besten selber testen!).


    Ich selber hatte mit -qmin=1 in dem Spiel Apex Legends Probleme, wodurch die Aufnahme ab und zu gehangen hat. Deswegen verwende ich für Apex Legends einen -qmin Wert von 10, wodurch bei meinen Setup keine Probleme aufkommen. Warum der -qmin Wert in Apex Probleme macht, kann ich leider nicht beantworten.


    Als zusätzlichen Test habe ich eine Aufnahme mit einen festen CQP Wert von 20 aufgenommen und danach eine Aufnahme mit den StreamFX Plugin -qmin 1 -qmax 20 gestartet.

    In der Aufnahme bin ich in einen dunklen Bereich gelaufen, um zu überprüfen wie sich die Bitraten verhalten:


    Aufnahme fester CQP Wert 20

    Offener Bereich: Ungefähr 50000 kbit/s

    Dunkler Bereich: Ungefähr 9000 kbit/s


    Aufnahme -qmin 1 -qmax 20:

    Offener Bereich: Ungefähr 50000 kbit/s

    Dunkler Bereich: Ungefähr 20000 kbit/s


    Wie man anhand der Beispiele sieht, bleiben die "schwer" (Offenen) komprimierbaren Bereiche gleich von der Bitrate, aber Szenen die einfacher (Dunkle Bereiche) zu komprimieren sind, genießen mit der -qmin und -qmax Kombination mehr Bitrate.

  • In deiner Liste gibt es Target Quality.

    Dürfte CRF sein. Bei H.264 geht CRF normalerweise auch bei NVEnc.

    Bei H.265 war es buggy, wobei es in TMPGEnc 7 und einer RTX Grafikkarte nun auch bei H.265 korrekt zu klappen scheint.


    Ich habe meine Aufnahme in:


    Code
    ffmpeg -rtbufsize 2147M -f dshow -framerate 60 -thread_queue_size 1024 -probesize 10M -pixel_format bgr24 -i video="Datapath VisionSC-DP2 Video 01":audio="Wave (ASUS Xonar HDAV Audio Device)" -f dshow -thread_queue_size 64 -i audio="Line (AudioBox 22VSL)" -map 0 -map 1 -vcodec h264_nvenc -pix_fmt yuv420p -rc:v vbr -b:v 0 -qmin 1 -qmax 16 -preset hp -acodec pcm_s16le -audio_buffer_size 80 "%fullpath%\%filename%.mkv"
    PAUSE

    Bei 2560x1600.

    Er scheint aber trotzdem nicht tiefer als QP 9 zu gehen. Keine Ahnung wie das bei deinem Plugin ist.

  • In deiner Liste gibt es Target Quality.

    Dürfte CRF sein. Bei H.264 geht CRF normalerweise auch bei NVEnc.

    Bei H.265 war es buggy, wobei es in TMPGEnc 7 und einer RTX Grafikkarte nun auch bei H.265 korrekt zu klappen scheint.

    Muss man für CRF noch etwas zusätzlich Konfigurieren? Wie z.B wieder die folgenden Werte auf 0: -b=0 -maxrate=0 -bufsize=0


    Er scheint aber trotzdem nicht tiefer als QP 9 zu gehen. Keine Ahnung wie das bei deinem Plugin ist.

    Leider hat man im Gegensatz zu FFMPEG in OBS keine genaue Anzeige welcher QP verwendet wird, was das Testen schwer macht.

  • Grade mal getestet, indem ich die Target Quality auf 16 und danach auf 10 geschaltet habe.

    Qmin und Qmax habe ich entfernt.


    Leider geht die Bitrate nicht über 40mbits.

    Wenn ich die Target Quality auf 70 setzte geht Sie aber auf 5mbits runter. Scheint also noch irgendwas nach oben hin zu blockieren.

  • Kommt ganz drauf an wie das Plugin und OBS an den Encoder letztendlich senden.

    Zur Sicherheit kann man ja maxrate und bufsize auf 0 setzen.


    Alles andere ist einfach nur für maximale Performance, da ich mein Video nach der Aufnahme eh neu encodieren muss

    Sollte die Aufnahme direkt auf Youtube dürfen, könnte man natürlich auch in CRF19 aufnehmen und Qualitätssettings verwenden. Aber wenn ich eh neu codieren muss kann ich ja den Video Encoder der Grafikkarte entlasten.

    Leider hat man im Gegensatz zu FFMPEG in OBS keine genaue Anzeige welcher QP verwendet wird, was das Testen schwer macht.

    Kann man allerhöchstens eine Videodatei als Quelle nehmen und die anschließenden Dateigrößen vergleichen (aber OBS kann wahrscheinlich nicht erst Aufnahme beginn wenn die Videodateiquelle spielt und aufhören wenn sie fertig ist, was ffmpeg ja kann.

    Aber wenn paar sekunden mehr schwarzbild beim OBS Video mit drin sind, sollte es trotzdem noch auffallen hoffentlich^^

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!