Streaming mit FFmpeg und HDMI-USB-Adapter nur in 720 stabil

FatManStanding

Lt. Junior Grade
Registriert
Aug. 2021
Beiträge
475
Hallo,

ich habe hier einen HDMI-USB-Adapter der an meinem Ubuntu-Rechner angeschlossen ist. Mittels ffmpeg erstelle ich einen Stream:

Code:
ffmpeg -f v4l2 -input_format mjpeg -framerate 25 -video_size 1280x720 -i /dev/video0 -f alsa -i iec958:CARD=MS2109,DEV=0 -c:v libx264 -b:v 1600k -preset fast -x264opts keyint=50 -g 25 -pix_fmt yuv420p -c:a aac -b:a 128k -f rtp_mpegts rtp://239.0.0.2:5001?ttl=2

Das ganze kann ich mit jedem netzwerkfähigen Player im Heimnetzwerk abspielen. Leider läuft nur 720p stabil, wenn ich einen 1080p-Stream erzeuge läuft das Bild ruckelartig. Die CPU-Auslastung für ffpmepg liegt laut 'top' bei 190%, was schon einmal ein komischer Wert ist.

Der Prozessor ist ein Celeron G5905 CPU @ 3.50GHz. Das ganze stammt aus einem ehemaligen Backup-Server. Wie kommt hier FFmpeg auf fast 200%? Sollte nicht vollausgelastet 100% sein? Rechnet der Kernel einzeln?
 
FatManStanding schrieb:
Der Prozessor ist ein Celeron G5905 CPU @ 3.50GHz. Das ganze stammt aus einem ehemaligen Backup-Server. Wie kommt hier FFmpeg auf fast 200%? Sollte nicht vollausgelastet 100% sein? Rechnet der Kernel einzeln?
Genau das ist der Fall, 100% bedeutet ein Kern voll ausgelastet.

Mehrere Ideen:

1. Veryfast anstatt fast verwenden
2. Kannst du statt CPU encoding, GPU encoding nutzen?
 
FatManStanding schrieb:
-x264opts keyint=50 -g 25
Das ist jetzt nicht für dein Problem verantwortlich, macht so aber keinen Sinn. Was du willst ist wahrscheinlich: keyint=50:min-keyint=25 oder -g 50 -x264opts min-keyint=25.

Ansonsten würde ich auch erste mal die Profile durch testen. Wenn was geeignetes gefunden ist, könnte man sich noch etwas weiter optimieren, wie z.B. -crf … statt b:v nehmen.
 
Amaoto schrieb:
Hast du es mit QuickSync versucht? https://trac.ffmpeg.org/wiki/Hardware/QuickSync
Das ist wesentlich schneller als mit Software allein. Evtl. muss dafür der VAAPI-Treiber gegen den non-free getauscht werden (unter Debian musste ich es machen).

Installiert ist aktuell intel-media-va-driver:amd64, ein non-free Installationskanditat ist vorhanden. Reicht es aus den non-free zu installieren und den anderen zu belassen ode rmuss ich noch extra angeben, dass der non-free-Treiber genutzt werden soll?

Wie müsste ich ffmpeg starten damit Quicksync für das Streaming genutzt wird? Die Beispiele sind alle für das reine Encoding.

Wenn ich einfach 'ffmpeg' ausführe fehlt bei mir "enable-libmfx", scheint so als sei die von mir installierte Version von ffmpeg ohne libmfx gebaut worden? Wenn ich einfach mal testweise libx264 durch h264_qsv ersetzte kommt

Code:
Unknown encoder 'h264_qsv'

Ansonsten würde ich auch erste mal die Profile durch testen. Wenn was geeignetes gefunden ist, könnte man sich noch etwas weiter optimieren, wie z.B. -crf … statt b:v nehmen.

'veryfast' hat schon einmal gute Ergebnisse gebracht, 'ultrafast' auch, die Qualität war aber sehr schlecht, eine Menge "Blockbildung".

Die geringere Auslastung die ich mir 'veryfast' bekomme mache ich mir komischerweise mit -crf wieder kaputt, egal ob ich verlustfrei (crf 0) oder höhere Werte verwende. Ich hätte vermutet, dass die Auslastung bei crf 0 geringer wird, die übertragene Datenrate dadurch (deutlich) höher.
 
Die Blockbildung kommt wegen der geringen Bitrate, die musst du erhören. Mit CRF ist das einfacher, weil ffmpeg hier die Bitrate selbst wählt. Würde mal mit CRF 23 anfangen und wenn dann noch etwas mehr Qualität gewünscht wird, kleinere Zahlen angeben. Wenn man eine statische Kamera als Quelle hat passiert im Bild eigentlich nicht so viel und 23, mit einer GOP Größe von 50, könnte reichen.
 
FatManStanding schrieb:
Reicht es aus den non-free zu installieren und den anderen zu belassen oder muss ich noch extra angeben, dass der non-free-Treiber genutzt werden soll?
Eigentlich sollte der free dabei automatisch deinstalliert werden. Beide können m.E. gar nicht gleichzeitig installiert sein. Musst du mal ausprobieren.

Selbst bauen musste ich ffmpeg nicht. Welches Ubuntu ist denn das?

FatManStanding schrieb:
Wie müsste ich ffmpeg starten damit Quicksync für das Streaming genutzt wird? Die Beispiele sind alle für das reine Encoding.
Streaming habe ich nicht getestet, dürfte aber im Grunde gleich sein. Ich vermute etwas in diese Richtung:
Code:
ffmpeg -init_hw_device qsv=hw -f v4l2 -input_format mjpeg -framerate 25 -video_size 1280x720 -i /dev/video0 -f alsa -i iec958:CARD=MS2109,DEV=0 -vf 'hwupload=extra_hw_frames=64,fps=fps=pal,scale_qsv=w=1280:h=720' -c:v h264_qsv -global_quality 25 -c:a aac -b:a 128k -f rtp_mpegts rtp://239.0.0.2:5001?ttl=2
 
Ich hab noch Ubuntu 20.04 und werde auch nicht auf die 22.04 updaten, weil der HDMI-USB-Adapter nicht unter 22.04 läuft.

Mir ist halt aufgefallen, dass er mit kein "enable-libmfx" anzeigt was sowei tich das verstehe bedeutet, dass ffmpeg in den Paketquellen ohne die entsprechende Funktion kompiliert wurde.

Ich werde das mal testen, wird aber vermutlich nicht gehen weil er bei mir ja vorher schon "-c:v h264_qsv" wegen "Unknown encoder 'h264_qsv'" abgelehnt hat - außer es liegt daran, dass ich die non-free-Treiber noch nicht installiert habe, was ich mir aber nicht vorstellen kann.
 
Zurück
Oben