Probleme mit FFMPEG und RTMP unter Ubuntu 24.02

Und wie starte ich dann via SystemD Service?

Wenn ich etwas an der Config ändere, dann muss ich auch Neustarten`/ reload?
 
Der Service muss aktiviert werden mit: systemctl enable srs (damit läuft er aber noch nicht, erst nach systemctl start srs). Dann läuft er immer automatisch, auch bei einem Neustart. Wenn du Änderungen an der Config machst, die deinen aktuellen Stream nicht beeinflussen, reicht ein systemctl reload srs, ansonsten systemctl restart srs.

Status prüfen kannst du mit systemctl status srs und fortlaufendes logging ausgeben geht mit: journalctl -f -u srs.
 
Zuletzt bearbeitet:
So, jetzt geht es.
Vielen Dank!

SRS kann mit "h264_qsv" umgehen?
 
  • Gefällt mir
Reaktionen: jb_alvarado
Code:
ffmpeg version 6.1.1-3ubuntu5 Copyright (c) 2000-2023 the FFmpeg developers
  built with gcc 13 (Ubuntu 13.2.0-23ubuntu3)
  configuration: --prefix=/usr --extra-version=3ubuntu5 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --disable-omx --enable-gnutls --enable-libaom --enable-libass --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libglslang --enable-libgme --enable-libgsm --enable-libharfbuzz --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-openal --enable-opencl --enable-opengl --disable-sndio --enable-libvpl --disable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-ladspa --enable-libbluray --enable-libjack --enable-libpulse --enable-librabbitmq --enable-librist --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libx264 --enable-libzmq --enable-libzvbi --enable-lv2 --enable-sdl2 --enable-libplacebo --enable-librav1e --enable-pocketsphinx --enable-librsvg --enable-libjxl --enable-shared
  libavutil      58. 29.100 / 58. 29.100
  libavcodec     60. 31.102 / 60. 31.102
  libavformat    60. 16.100 / 60. 16.100
  libavdevice    60.  3.100 / 60.  3.100
  libavfilter     9. 12.100 /  9. 12.100
  libswscale      7.  5.100 /  7.  5.100
  libswresample   4. 12.100 /  4. 12.100
  libpostproc    57.  3.100 / 57.  3.100
 V..... h264_qsv             H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (Intel Quick Sync Video acceleration) (codec h264)
 
Schaut gut aus! Dazu wird aber libvpl genommen, und nicht libmfx. Soviel ich weiß ist das die neuere Library, was gut ist.
 
  • Gefällt mir
Reaktionen: SirLoading
Beim ffmpeg in der Konsole hatte immer gemeckert wegen libmfx und als Lösung habe ich das installiert.

Wie bekomme ich das nun in srs zum laufen?
 
SirLoading schrieb:
Beim ffmpeg in der Konsole hatte immer gemeckert wegen libmfx und als Lösung habe ich das installiert.
Komisch, weil ffmpeg mit --enable-libvpl --disable-libmfx gebaut ist. Vielleicht kannst du noch libvpl nach installieren.

SirLoading schrieb:
Wie bekomme ich das nun in srs zum laufen?
In dem du die Parameter im engine ... Abschnitt anpasst, mit:

NGINX:
engine myengine {
    enabled         on;
    iformat         live_flv;
    vfilter {
        v           error;
    }
    vcodec          h264_qsv;
    vparams {
        global_quality  25;
    }
    acodec          aac;
    abitrate        128;
    oformat         flv;
    output          rtmp://example.org/appname/key;
}
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: SirLoading
1721813377878.png

1721813471563.png
 
Prüfe noch mal ob srs wirklich läuft, auch mit netstat -tupln. Und den AppName und StreamKey prüfen, das muss mit transcode live/stream (appname/key) übereinstimmen.
 
  • Gefällt mir
Reaktionen: SirLoading
jb_alvarado schrieb:
Prüfe noch mal ob srs wirklich läuft,
1721813753563.png


jb_alvarado schrieb:
AppName und StreamKey prüfen
Das passt, wenn ich zu vcodec copy gehe, dann geht es.
Via libx264 geht es auch.
Via h264_qsv geht es nicht.
Ergänzung ()

Nachtrag:
Auf meinem alten Server nutze ich folgendes für Twitch:
Code:
-c:v h264_qsv -x264-params keyint=120 -preset veryslow -b:v 6000k -minrate 6000k -maxrate 6000k -bufsize 4000k -preset veryslow -profile:v high -s 1920x1080 -r 60 -c:a copy -tune zerolatency
 
Jetzt wird es leider etwas ungemütlich... SRS prüft den encoder und unterstützt standardmäßig nur libx264. Also müssen wir den Code etwas anpassen:

1. navigiere noch mal in das Git Repo welches du geklont hast, dort in den Ordner trunk
2. dann öffnest du die Daten: src/app/srs_app_ffmpeg.cpp in einem Texteditor, z.B. nano
3. nach der Zeile 37 (#define SRS_RTMP_ENCODER_VCODEC_LIBX264 "libx264") fügst du diese Zeile ein:
#define SRS_RTMP_ENCODER_VCODEC_H264QSV "h264_qsv"

4. dann suchst du nach der Zeile if (vcodec != SRS_RTMP_ENCODER_VCODEC_LIBX264) und änderst sie in: if (vcodec != SRS_RTMP_ENCODER_VCODEC_LIBX264 && vcodec != SRS_RTMP_ENCODER_VCODEC_H264QSV), müsste Zeile 127 sein.

5. Direkt die nächste Zeile mit dem return ... änderst du in:
return srs_error_new(ERROR_ENCODER_VCODEC, "invalid vcodec, must be %s or %s, actual %s", SRS_RTMP_ENCODER_VCODEC_LIBX264, SRS_RTMP_ENCODER_VCODEC_H264QSV, vcodec.c_str());

6. dann wieder kompilieren mit make -j4
7. altes SRS deinstallieren: make uninstall
8. neu installieren: make install
9. Service neustartet: systemctl restart srs

Hier habe ich die angepasste Datei: https://github.com/jb-alvarado/srs/blob/develop/trunk/src/app/srs_app_ffmpeg.cpp zum Vergleich.

Bei der Konfig haben auch noch Paramter gefehlt. Es müssen mindestens diese vorhanden sein:

Code:
engine myengine {
    enabled         on;
    iformat         live_flv;
    vfilter {
        v           error;
    }
    vcodec          h264_qsv;
    vprofile        main;
    vpreset         medium;
    vthreads        0;
    vparams {
        global_quality  25;
    }
    acodec          aac;
    abitrate        128;
    oformat         flv;
    output          rtmp://127.0.0.1:1936/live/stream1;
}
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: SirLoading
Puh, das war ein Kampf! :D
Vielen Dank!!!

Nun kann ich die ffmpeg Parameter so anpassen wie ich Sie brauche.

Drei Fragen noch:
Wenn ich meinen Livestream an mehrer Plattformen senden möchten, dann läuft das unter transcode live/stream {...} und für jede Plattform mache ich eine Engine: engine PLATTFORM {...}.

Wenn ich ein weiteres brauche für einen 24/7 Stream, dann mache ich ein weiteres transcode live/247stream {...}?

Und Frage 2:
Kann man hier auch einen Short Stream zusammenschustern?
Input: 1920x1080p60
Output: 1080x1920p60
Hier soll Facecam unten und ein Ausschnitt des Spiels oben sein.

Und Frage 3:
Hast du eine Kaffeekasse? ;)
 
SirLoading schrieb:
Wenn ich meinen Livestream an mehrer Plattformen senden möchten, dann läuft das unter transcode live/stream {...} und für jede Plattform mache ich eine Engine: engine PLATTFORM {...}.

Wenn ich ein weiteres brauche für einen 24/7 Stream, dann mache ich ein weiteres transcode live/247stream {...}?

Ich meine es geht nur eine transcode Einheit, aber was du möchtest geht damit auch:
Statt transcode live/stream gibst du nur den Appnamen an, also z.B. transcode live. Bei den engines gibst du dann den key mit an: engine stream.

Wenn deine Zielplattformen die gleichen encoding Einstellungen haben, kannst du theoretisch einen tee muxer nehmen. Dabei muss nur einmal encoded werden.

Wenn du unterschiedliche Settings brauchst, kannst du das auch schachteln:

Code:
transcode live {
    enabled     on;
    ffmpeg      /usr/bin/ffmpeg;
    engine stream {
        enabled         on;
        iformat         live_flv;
        vfilter {
            v           error;
        }
        vcodec          h264_qsv;
        vprofile        main;
        vpreset         medium;
        vthreads        0;
        vparams {
            global_quality  25;
            c:aac           aac;
            b:a             128;
            f               flv;
            y               rtmp://target1/live/stream;
            c:v             h264_qsv;
            s               1280x720;
            preset          slower;
        }
        acodec          aac;
        abitrate        128;
        oformat         flv;
        output          rtmp://target2/live/stream;
    }
}

SirLoading schrieb:
Und Frage 2:
Kann man hier auch einen Short Stream zusammenschustern?
Input: 1920x1080p60
Output: 1080x1920p60
Hier soll Facecam unten und ein Ausschnitt des Spiels oben sein.
Mit ffmpeg geht sehr viel, vielleicht könnte man da mit crop anfangen. Von HD 16:9 nach HD 9:16 ist natürlich etwas ungünstig, weil dann Pixel in der Höhe fehlen. OBS unterstützt jetzt doch auch multiple Outputs, oder? Damit ist das vielleicht etwas komfortable einzustellen, weil du dann dort dein Bild zusammensetzten kannst, wie du das möchtest.
SirLoading schrieb:
Hast du eine Kaffeekasse? ;)
Danke, passt schon :-).

Weiß nicht ob ich heute noch mal dazu komme zu antworten, falls noch was ist, dann morgen.
 
  • Gefällt mir
Reaktionen: SirLoading
Ok, soweit alles super.

YouTube meckert wegen den Keyframes
Vermutlich habe ich das falsch gemacht?
1721840781148.png


Nachtrag:
bitrate habe ich auf b:v 6000k geändert.
 
Zuletzt bearbeitet:
Die Keyframes kannst du mit g 120 setzen, x264-params greift nicht bei h264_qsv.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: SirLoading
OK, danke.
Teste ich heute Abend Mal.
Für Short habe ich den Stream um 90 Grad gedreht.
Kümmere ich mich später drum.

Habe für jede Plattform eine engine gemacht.
Sollte eigentlich gehen?!
Finde alles in eine etwas umständlich / unübersichtlich.

Vielen Dank
 
SirLoading schrieb:
Habe für jede Plattform eine engine gemacht.
Sollte eigentlich gehen?!
Ja das geht, macht es sicher etwas übersichtlicher.

vpreset veryslow finde ich noch etwas suboptimal. Das verbraucht viel Rechenleistung und ist unter Umständen nicht nötig. Du streamst ja von einem Hertzner Server aus, der genug Bandbreite hat. Lieber ein weniger aggressives Preset nehmen und die Bitrate erhöhen, wenn das die Plattform erlaubt.
 
  • Gefällt mir
Reaktionen: SirLoading
Zurück
Oben