"Streaming Box" für YouTube Streaming (FFmpeg)

ro.p

New Member
Hallo zusammen
ich brauche Infos / Feedback zu folgenden Frage.

Ich würde gerne eine "Streaming Box" mit FreeBSD und FFmpeg realisieren, wo ich Aufnahmen von eine Kamera die per USB angeschlossen ist direkt zu YouTube streamen kann.
Ich habe div. Test mit Linux gemacht, mit Linux Mint funktioniert es nicht so schlecht.
Ich würde das aber gerne per FreeBSD umsetzten.

Erste Tests waren ein wenig mühsam, USB Kamera nicht erkannt usw. (FreeBSD 14.4)
Das grösste Problem war aber das die Auslastung vom kleinen PC auf 80-90% war und auch FFmpeg meldete das div. Pakete verloren gehen.
Beim Linux Mint 12% Auslastung, Stream ist gut.

Ich habe jetzt nicht mehr alle Fehlermeldungen die bei FreeBSD aufgetaucht sind, die grundsätzliche Frage ist ob es sich lohnt sich die Mühe das mit FreeBSD zu machen?

Gründe:
Ich würde es gerne hinbekommen (Lerneffekt), die Box müsste ohne GUI (bei Mint läuft es nur gut wenn eine GUI läuft, die ich aber nicht brauche) laufen und sie müsste "einfach laufen" ohne das man rumbastelt.

Das Projekt geht noch weiter, aber das sind mal die grundsätzlichen Fragen...

Wer schon Erfahrung gemacht hat mit solchen Dingen oder irgendwo ein How-To ist, bin dankbar über jedes Feedback
 
Ohne jetzt einen Vergleichswert zu haben, aber ffmpeg hat viele Optionen zum optimieren. Das faengt mit der Aufloesung (video_size) an, geht mit Bildern pro Sekunden (framerate) weiter und hoert mit dem Codec auf. Dazwischen gibt es aber auch noch mehr Optionen wie hardware-/software-encoding, Filter, Audio, usw. an denen man drehen kann. Es gibt auch presets wie z.B. -preset ultrafast
 
Specs? CPU, RAM, GPU?

Ich würde es gerne hinbekommen (Lerneffekt)
Ich rate, dass du die GPU-Beschleunigung bei Mint angeklickt hattest und das encoding dann darüber lief. Das sollte auch mit FreeBSD 1:1 so funktionieren, wie du ffmpeg unter Mint genutzt hattest. Nur muss man dafür den GPU-Treiber manuell einrichten.

Welche codecs deine GPU kann oder was youtube bestenfalls angeliefert haben will, weiß ich nicht.
 
Danke fürs Feedback, es geht mir zu Zeit um die grundsätzliche Machbarkeit, dann werde ich das mal gründlicher testen..

Der PC ist ein CSL Mini PC Narrow Box
Intel N200, 1TB SSD, 16 GB RAM, Intel UHD Graphics

Die Test habe ich mit:
Linux Mint 22.3 mit Xfce 64bit -> läuft ok
Ubuntu Server 24.04.4 LTS -> läuft mit hoher Last und ruckeln
und FreeBSD 14.4 gemacht -> läuft mit hoher Last und ruckeln

Der FFmpeg Befehl war überall im Prinzip gleich, aber wie gesagt, es waren kurze Testes ohne grosse Fehlersuche.

Ich werde versuchen das mal mit FreeBSD zum laufen zu bringen, ein paar Tipps waren ja schon dabei.

Vielen Dank
 
Fast sicher nutzte Linux Mint den Hardware-Codec der Grafikkarte zum Encoden. Das geht natürlich auch mit Ubuntu und FreeBSD. Die ffmpeg-Optionen kann ich dir nachher raussuchen, ich komme nur gerade vom Handy nicht ran.
 
Drm-kmod ist installiert und läuft ? Vulkan ist auch installiert ? M.W. kann ffmep über Vulkan die gpu-hw nutzen. Die Intel hd6xx Grafik wird normalerweise auch gut von freebsd unterstützt.

Wenn man von Linux kommt viele cht nicht Standard. Zumindest in der Vergangenheit war es bei FreeBSD immer eine gute Idee den drm-kmod in den Ports zu bauen, anstatt das package zu nutzen.
 
Also, vorweg: ffmpeg kann in Hardware decoden und encoden. Beides ist frei kombinierbar, man kann also das Eine ohne das Andere haben. Generell macht Decoding in Hardware nur Sinn, wenn man keine Filter verwendet. Denn mit der Ausnahme der paar von der Hardware unterstützten, qualitativ oft eher fragwürdigen fragwürdigen Filter laufen die Filter auf der CPU. Die decodierten Frames müssen also von der GPU auf die CPU kopiert werden, was vergleichsweise teuer ist. ffmpeg unterstützt mehrere APIs, unter freien Systemen vor allem VAAPI und Vulkan. Qualitativ nehmen die sich nichts, denn die Hardware bleibt ja immer gleich. Als ich Vulkan zum Encoden zum letzten Mal unter FreeBSD probiert habe, war es gelinde gesagt wackelig. Das hat sich seitdem wahrscheinlich geändert, trotzdem nehme ich hier in den Beispiel VAAPI. Vulkan funktioniert äquivalent. Und last but not least ist die erreichte Qualität vom Hardware-Codec abhängig, neuere Grafikkarten sind oft besser als alte und mit Intel ist man recht gut dabei.

Optionen zum Decoden kommen vor die Eingabedatei, also vor das -i. Optionen zum Encoden kommen nach die Eingabedatei. Die gewünschte Qualität in Relation zur Dateigröße wird als Faktor angegeben, wobei die Skala vom Codec abhängig ist. Die meiste Hardware unterstützt eine Reihe Codecs, ich nehme hier HEVC da es ein guter Kompromiss aus Unterstützung und Speicherplatzeffizienz ist.

Zum Decoden: -vaapi_device /dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi

  • Nutzt das DRM-Device renderD128, was das erste Device ist.
  • Selektiert VAAPI als API.
  • Und decodiert in ein Format, was VAAPI-Encoder lesen können.

Wenn man nicht auf der GPU decodet oder weitere Filter im Spiel sind: -vf format='nv12|vaapi,hwupload'

  • Konvertiert ins nv12-Standardframeformat.
  • Und lädt die Frames auf die GPU.

Zum Encoden: -c:v:0 hevc_vaapi -rc_mode ICQ -qp $QP

  • Selektiert hevc_vaapi als Codec.
  • ICQ ist der einzig sinnvolle Mode, wenn man keine feste Bitrate will und das will man nicht.
  • Der -qp ist der Qualitätsfaktor. Pi mal Daumen ist 25 sehr gute Qualität, 26 der sinnvolle Kompromiss und 27 gibt kleine Dateien zu Lasten der Qualität.

Als ganzes Beispiel:

Code:
% ffmpeg -hwaccel vaapi -vaapi_device /dev/dri/renderD128 \
         -i eingabe.mkv \
         -map 0:0 -map 0:1 -map 0:3 -map 0:5 \
         -af aformat=channel_layouts="7.1|5.1|stereo" \
         -c:v hevc_vaapi -rc_mode ICQ -qp 26 \
         -c:a:0 libopus -b:a:0 240K -metadata:s:a:0 lang=ger \
         -c:a:1 libopus -b:a:1 240K -metadata:s:a:1 lang=jpn \
         -c:s:0 copy -metadata:s:s:0 lang=ger \
         -metadata title="Titel eines nicht urheberrechtlich geschützten Films" \
         ausgabe.mkv

Darüber hinaus ist Encoding ein komplexes Thema, gerade wenn es Dinge wie Bildrauschen, Detailschärfe und verschiedene HDR-Fomate geht. Da muss man sich für wirklich gute Ergebnisse tief einlesen, was nicht mal eben in ein paar Zeilen in einem Forum getan ist ;)
 
Hinzuzufügen wäre bei speziell diesem Webcam/Streamingfall, dass man nicht zwingend erst den Cam-Input mit vaapi decoden muss. Es ist nämlich fraglich, ob die Kamera ein dafür kompatibles Format liefert und zweitens ist dieser Part nicht der, der böse auf die CPU haut.

Code:
-c:v hevc_vaapi -rc_mode ICQ -qp 26
Das ist der harte Part, diesen will man unbedingt von der GPU schuften lassen. :)

Wenn du uns mal deine bisherige ffmpeg-Zeile zeigst, gibts vielleicht noch ein paar Tips.
Das geht noch schneller, wenn du weiblich und nackt vor besagter Kamera bist sowie den Link teilst.:p
 
Zurück
Oben