staging.inyokaproject.org

Hardware beschleunigtes Videostudio OBS für Nvidia Grafikkarten

Status: Gelöst | Ubuntu-Version: Kubuntu 19.10 (Eoan Ermine)
Antworten |

trollsportverein

Avatar von trollsportverein

Anmeldungsdatum:
21. Oktober 2010

Beiträge: 2627

Hallo erstmal.

Vorneweg: ohne selber machen geht es zur Zeit nicht!

Als nehmt euch etwas Zeit und eine schöne Tasse Kaffee oder Tee wenn ihr OBS Studio mit Hardwarebeschleunigung haben wollt. Wirklich schwierig ist das nicht. Fertigpakete für Linux sind aber leider bislang tabu. Also bleibt nur selber machen, dann hat man aber auch die Hardwarebeschleunigung, wie unter Windows mit dem so vermarkteten "ShadowPlay" möglich ist, ganz ohne "GeForce Experience" und Anmeldezwänge.

Die Vorlage findet sich hier in diesem Beitrag auf Youtube, ja tatsächlich Youtube: https://www.youtube.com/watch?v=CD9t2bszg_Y&t=131s.

Ich schreibe aber noch ein paar Ergänzungen und eine winzige Korrektur dazu.

Das hier funktioniert genau so:

1 - Download the Nvidia SDK:
wget https://developer.nvidia.com/video-sd...
sudo apt install unzip
unzip video-sdk-601
sudo cp nvidia_video_sdk_6.0.1/Samples/common/inc/*.h /usr/local/include/

2 - Getting ready to compile FFMPEG
sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup
sudo nano /etc/apt/sources.list
sudo apt update
sudo apt build-dep ffmpeg
sudo apt install libfdk-aac-dev

3 - Compiling ffmpeg
apt-get source ffmpeg
cd ffmpeg-VERSION NUMBER

Aber das Kommando für die buildconfig ist:

ffmpeg -buildconf

Den Schritt 2 brauchte ich nicht, da meine Repositorys längst passten.

Die Liste der Header Dateien vom nvidia_video_sdk_6.0.1, die nach /usr/local/include/ kopiert wurden, falls sie später wieder entfernt werden wollen:

cudaModuleMgr.h
drvapi_error_string.h
dynlink_builtin_types.h
dynlink_cuda_cuda.h
dynlink_cudaD3D10.h
dynlink_cudaD3D11.h
dynlink_cudaD3D9.h
dynlink_cuda_d3d.h
dynlink_cuda_gl.h
dynlink_cudaGL.h
dynlink_cuda.h
dynlink_cuviddec.h
dynlink_nvcuvid.h
exception.h
helper_cuda_drvapi.h
helper_cuda.h
helper_functions.h
helper_string.h
helper_timer.h
nvCPUOPSys.h
nvEncodeAPI.h
nvFileIO.h
NvHWEncoder.h
nvUtils.h

Schlussendlich das ./configure auf meiner Kubuntu Eoan Ermine (19.10) Installation war dann:

./configure --prefix=/usr --extra-version=1build2 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared --enable-nonfree --enable-nvenc --enable-libfdk-aac

Der make Befehl läuft nur auf einem CPU Kern. Das macht dann noch nicht mal viel Last, dauert aber etwas.

make

Das sollte dann möglichst durchlaufen. Wenn nicht, genau lesen woran es hängt und gegebenenfalls fehlendes nachinstallieren. Bei mir waren das die nv-codec-headers:

mkdir ~/nv-codec && cd ~/nv-codec
git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git

Und dann:

cd nv-codec-headers
make && sudo make install

Anschließend wieder den ffmpeg-4.1.4 in seinem Verzeichnis weiterbauen. Wenn alles durchgelaufen ist geht es ans installieren:

sudo make install

Was das installieren betrifft, das ist sicherlich so noch nicht ganz optimal, da wäre zum Beispiel checkinstall zu erwägen. Aber nicht vergessen, selber machen ist Ok, aber was die Distribution von Fertigpaketen betrifft, da gibt es eine Warnung.

Nun aber wirds spannend, funktioniert das auch? Also OBS-Studio starten und gucken ob dann zur Auswahl für den Kodierer "Hardware (NVENC)" in den Einstellungen für die Videoausgabe auftaucht. Und dann testen. Wenn dann eine Warnmeldung erscheinen sollte wegen irgendeinem Fehler, so wie es bei mir war, nochmal über das Terminal mit dem Befehl obs starten:

obs

Erst im Terminal konnte man sehen das durch die aus dem Videolan Projekt geklonten nv-codec-headers die API des gebauten bereits 9.1 war, aber der "alte" Grafiktreiber des nvidia-driver 430.50 Pakets vom 05.09.2019 noch die API 9.0 nutzte. Da half dann nur auf den Short Lived Branch umzusteigen und auf die nvidia-driver Version 435.21 zu gehen. Damit läufts, bei mir, auf Kubuntu Eoan Ermine. 😎

Keine Angst, das ist alles gar nicht so schwer. Das schreiben der Anleitung ist mühseliger als das bisschen frickeln. ☺

trollsportverein

(Themenstarter)
Avatar von trollsportverein

Anmeldungsdatum:
21. Oktober 2010

Beiträge: 2627

Es lohnt sich übrigens nicht nur für das OBS-Studio, auch Kdenlive nutzt dann den Nvidia Hardware beschleunigten NvEnc im gepimpten ffmpeg! 👍

Schaut mal: Kdenlive mit Hardware beschleunigtem NvEnc. Da kommt Freude auf. 😎

Vorteile (und erweiterte Einstellungen für den NvEnc im OBS-Studio) werden dort bei Nvidia beschrieben: https://www.nvidia.com/en-us/geforce/guides/broadcasting-guide.

trollsportverein

(Themenstarter)
Avatar von trollsportverein

Anmeldungsdatum:
21. Oktober 2010

Beiträge: 2627

In Focal Fossa sind die aktuellen FFmpeg Pakete nun mit external nv-codec-headers für NVENC Nvidia-GPU-Hardware beschleunigtes Video gebaut.

Davon profitiert nicht nur das OBS-Studio, sondern auch Kdenlive das Videobearbeitungsprogramm.

Andi-S

Avatar von Andi-S

Anmeldungsdatum:
27. Oktober 2008

Beiträge: Zähle...

Das mit der sources.list verstehe ich nicht

sudo apt build-dep ffmpeg
Paketlisten werden gelesen... Fertig
E: Quellpaket für ffmpeg kann nicht gefunden werden

trollsportverein

(Themenstarter)
Avatar von trollsportverein

Anmeldungsdatum:
21. Oktober 2010

Beiträge: 2627

Moin,

die /etc/apt/sources.list enthält Einträge, in denen Quellen für Pakete enthalten sind. In diese Datei lässt sich leicht hineinschauen mit cat.

cat /etc/apt/sources.list

In der sources.list lassen sich die Quellen (Software Repositorys) für Sourcecode freischalten.

  • Die Sourcecode Repositorys sind diejenigen, bei denen am Beginn der Zeile "deb-src" steht.

  • Die Zeilen, an denen am Beginn der Zeile nur "deb" steht, sind die Repositorys für die Fertigpakete.

Steht ein oder mehrere "#" vor der Zeile, dann ist diese Zeile auskommentiert. Möchte man deb-src freischalten, dann muss das "#" davor entfernt werden.

Im Verzeichnis /etc/apt/sources.list.d/ können zusätzliche Quellen eingetragen werden. Beispielsweise ein PPA für das OBS-Studio.

Ab Focal Fossa werden die Fertigpakete für FFmpeg so gebaut, dass der nvenc sich mit den FFmpeg Fertigpaketen von Ubuntu nutzen lässt. FFmpeg selbst bauen ist also ab Focal Fossa entbehrlich für Hardware beschleunigte Videos generieren auf passenden Nvidia-GPUs mit entsprechendem nvidia-driver.

Nachschauen ob FFmpeg mit nvenc (Nvidia Encoder) Unterstützung gebaut wurde lässt sich so:

ffmpeg -hide_banner -h encoder=h264_nvenc

Welches Ubuntu Release genutzt wird lässt sich so nachschauen:

lsb_release -a

Zum Zeitpunkt im Oktober 2019, als ich das erste Posting in diesem Thread schrieb, gab es noch keine FFmpeg Fertigpakete mit nvenc auf Kubuntu, aber das war damals Eoan Ermine, was inzwischen längst aus dem Supportzeitraum heraus gefallen ist.

Andi-S

Avatar von Andi-S

Anmeldungsdatum:
27. Oktober 2008

Beiträge: 326

Das mit deb-src ist schon klar !!

Aber trozdem

sudo apt build-dep ffmpeg
Paketlisten werden gelesen... Fertig
E: Quellpaket für ffmpeg kann nicht gefunden werden

Irgendwie kompliziert 😲

ffmpeg -hide_banner -h encoder=h264_nvenc
Encoder h264_nvenc [NVIDIA NVENC H.264 encoder]:
    General capabilities: delay hardware 
    Threading capabilities: none
    Supported pixel formats: yuv420p nv12 p010le yuv444p p016le yuv444p16le bgr0 rgb0 cuda
h264_nvenc AVOptions:
  -preset            <int>        E..V..... Set the encoding preset (from 0 to 11) (default medium)
     default                      E..V..... 
     slow                         E..V..... hq 2 passes
     medium                       E..V..... hq 1 pass
     fast                         E..V..... hp 1 pass
     hp                           E..V..... 
     hq                           E..V..... 
     bd                           E..V..... 
     ll                           E..V..... low latency
     llhq                         E..V..... low latency hq
     llhp                         E..V..... low latency hp
     lossless                     E..V..... 
     losslesshp                   E..V..... 
  -profile           <int>        E..V..... Set the encoding profile (from 0 to 3) (default main)
     baseline                     E..V..... 
     main                         E..V..... 
     high                         E..V..... 
     high444p                     E..V..... 
  -level             <int>        E..V..... Set the encoding level restriction (from 0 to 51) (default auto)
     auto                         E..V..... 
     1                            E..V..... 
     1.0                          E..V..... 
     1b                           E..V..... 
     1.0b                         E..V..... 
     1.1                          E..V..... 
     1.2                          E..V..... 
     1.3                          E..V..... 
     2                            E..V..... 
     2.0                          E..V..... 
     2.1                          E..V..... 
     2.2                          E..V..... 
     3                            E..V..... 
     3.0                          E..V..... 
     3.1                          E..V..... 
     3.2                          E..V..... 
     4                            E..V..... 
     4.0                          E..V..... 
     4.1                          E..V..... 
     4.2                          E..V..... 
     5                            E..V..... 
     5.0                          E..V..... 
     5.1                          E..V..... 
  -rc                <int>        E..V..... Override the preset rate-control (from -1 to INT_MAX) (default -1)
     constqp                      E..V..... Constant QP mode
     vbr                          E..V..... Variable bitrate mode
     cbr                          E..V..... Constant bitrate mode
     vbr_minqp                    E..V..... Variable bitrate mode with MinQP (deprecated)
     ll_2pass_quality              E..V..... Multi-pass optimized for image quality (deprecated)
     ll_2pass_size                E..V..... Multi-pass optimized for constant frame size (deprecated)
     vbr_2pass                    E..V..... Multi-pass variable bitrate mode (deprecated)
     cbr_ld_hq                    E..V..... Constant bitrate low delay high quality mode
     cbr_hq                       E..V..... Constant bitrate high quality mode
     vbr_hq                       E..V..... Variable bitrate high quality mode
  -rc-lookahead      <int>        E..V..... Number of frames to look ahead for rate-control (from 0 to INT_MAX) (default 0)
  -surfaces          <int>        E..V..... Number of concurrent surfaces (from 0 to 64) (default 0)
  -cbr               <boolean>    E..V..... Use cbr encoding mode (default false)
  -2pass             <boolean>    E..V..... Use 2pass encoding mode (default auto)
  -gpu               <int>        E..V..... Selects which NVENC capable GPU to use. First GPU is 0, second is 1, and so on. (from -2 to INT_MAX) (default any)
     any                          E..V..... Pick the first device available
     list                         E..V..... List the available devices
  -delay             <int>        E..V..... Delay frame output by the given amount of frames (from 0 to INT_MAX) (default INT_MAX)
  -no-scenecut       <boolean>    E..V..... When lookahead is enabled, set this to 1 to disable adaptive I-frame insertion at scene cuts (default false)
  -forced-idr        <boolean>    E..V..... If forcing keyframes, force them as IDR frames. (default false)
  -b_adapt           <boolean>    E..V..... When lookahead is enabled, set this to 0 to disable adaptive B-frame decision (default true)
  -spatial-aq        <boolean>    E..V..... set to 1 to enable Spatial AQ (default false)
  -temporal-aq       <boolean>    E..V..... set to 1 to enable Temporal AQ (default false)
  -zerolatency       <boolean>    E..V..... Set 1 to indicate zero latency operation (no reordering delay) (default false)
  -nonref_p          <boolean>    E..V..... Set this to 1 to enable automatic insertion of non-reference P-frames (default false)
  -strict_gop        <boolean>    E..V..... Set 1 to minimize GOP-to-GOP rate fluctuations (default false)
  -aq-strength       <int>        E..V..... When Spatial AQ is enabled, this field is used to specify AQ strength. AQ strength scale is from 1 (low) - 15 (aggressive) (from 1 to 15) (default 8)
  -cq                <float>      E..V..... Set target quality level (0 to 51, 0 means automatic) for constant quality mode in VBR rate control (from 0 to 51) (default 0)
  -aud               <boolean>    E..V..... Use access unit delimiters (default false)
  -bluray-compat     <boolean>    E..V..... Bluray compatibility workarounds (default false)
  -init_qpP          <int>        E..V..... Initial QP value for P frame (from -1 to 51) (default -1)
  -init_qpB          <int>        E..V..... Initial QP value for B frame (from -1 to 51) (default -1)
  -init_qpI          <int>        E..V..... Initial QP value for I frame (from -1 to 51) (default -1)
  -qp                <int>        E..V..... Constant quantization parameter rate control method (from -1 to 51) (default -1)
  -weighted_pred     <int>        E..V..... Set 1 to enable weighted prediction (from 0 to 1) (default 0)
  -coder             <int>        E..V..... Coder type (from -1 to 2) (default default)
     default                      E..V..... 
     auto                         E..V..... 
     cabac                        E..V..... 
     cavlc                        E..V..... 
     ac                           E..V..... 
     vlc                          E..V..... 
  -b_ref_mode        <int>        E..V..... Use B frames as references (from 0 to 2) (default disabled)
     disabled                     E..V..... B frames will not be used for reference
     each                         E..V..... Each B frame will be used for reference
     middle                       E..V..... Only (number of B frames)/2 will be used for reference
  -a53cc             <boolean>    E..V..... Use A53 Closed Captions (if available) (default true)


lsb_release -a
LSB Version:	core-11.1.0ubuntu2-noarch:printing-11.1.0ubuntu2-noarch:security-11.1.0ubuntu2-noarch
Distributor ID:	Linuxmint
Description:	Linux Mint 20.2
Release:	20.2
Codename:	uma

trollsportverein

(Themenstarter)
Avatar von trollsportverein

Anmeldungsdatum:
21. Oktober 2010

Beiträge: 2627

Moin,

FFmpeg liegt bei (K)Ubuntu in universe. So auch das FFmpeg Sourcecode Paket.

Bei Linuxmint muss ich passen.

Linuxmint ist nicht meine genutzte Distribution.

Dort sollten sich die Leute besser mit Linuxmint auskennen.

Das Fertigpaket von FFmpeg zeigt aber in der geposteten Ausgabe von Linuxmint bereits an, das nvenc eingebaut ist und somit auch genutzt werden kann, sofern die notwendige Nvidia GPU eingebaut und der dazu passende proprietäre nvidia-driver installiert sind.

Antworten |