Streaming Server mit Linux

vorhergehende Artikel in: Linux Video Links
17.08.2019

Ich habe schon länger darüber nachgedacht, einmal zu versuchen, einen Streaming-Server aufzubauen. Da es in letzter Zeit wieder einmal sehr war draußen ist, habe ich die Zeit, die ich vor der Hitze Schutz suchte dazu genutzt, diese Idee in die Praxis umzusetzen...

Meine ersten Versuche waren eher unbeholfen: Ich nutzte die Möglichkeit, VLC zu bitten, die abgespielten Inhalte weiterzustreamen. Das Ergebnis war mehr als holprig.

Danach stellte ich zunächst systematisch meine Anforderungen zusammen: Die Lösung sollte beliebiges Material streamen, der Stream sollte aus dem Internet abrufbar sein und die Auflösung und Qualität sollten möglichst hoch sein.

Ich begann nun mit einer ernsthaften Recherche, die mich zunächst zu einer Lösung brachte, die zwar nicht mehr aktiv weiterentwickelt wurde, jedoch die ersten vielversprechenden Resultate erbrachte: Ich verwendete ffserver und konnte damit einen Stream erzeugen, der 640x390 Pixel Auflösung aufwies.

Die Auflösung konnte zuächst nicht weiter gesteigert werden, weil bereits mit dieser relativ niedrigen Auflösung die CPU mit dem Transkoding überfordert war.

Damit war ich noch nicht ganz zufrieden: prinzipiell funktionierte damit das Streaming zwar stabil - auch ins Internet - aber die Auflösung war dann doch arg gering. Das brachte mich dazu, mich mit Möglichkeiten zu beschäftigen, ffmpeg durch Hardwareunterstützung zu beschleunigen. Ein Kollege hatte mich bereits vor einiger Zeit auf das Stichwort "quicksync" in diesem Zusammenhang aufmerksam gemacht.

Eine Suche im Internet nach diesem Begriff brachte mich auch recht schnell auf eine Möglichkeit, diese Unterstützung für das Umrechnen von Inhalten in meiner Medienbibliothek zu nutzen (Inhalte von DVDs oder per Videorekorder aufgezeichneter Transportströme.

Ich testete dieses Verfahren mit zwei Intel-CPUs, die auf den Befehl

cat /proc/cpuinfo  | grep "model name" | head -1

die folgenden Ausgaben lieferten:

model name	: Intel(R) Core(TM) i3-2100 CPU @ 3.10GHz
model name      : Intel(R) Core(TM) i3-6100T CPU @ 3.20GHz

Der erste, bereits etwas ältere schaffte bei der Umrechnung des Testvideos (Standard 2D Full HD, 30 fps) einen Geschwindigkeitsfaktor von 3.4 eggenüber dem reinen Abspielen, während der neuere bereits auf eine Faktor von 5.22 kam. Als reine Softwarevariante konnten beide mit einem Faktor von weit unter 1 nicht glänzen.

Das zum Test benutzte Kommando war

ffmpeg -init_hw_device vaapi=foo:/dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi -hwaccel_device foo -i bbb_sunflower_1080p_30fps_normal.mp4 -filter_hw_device foo -vf 'format=nv12|vaapi,hwupload' -c:v h264_vaapi -preset slow -crf 20 -tune film -acodec mp3 output_hw.mp4

Damit war das Prinzip und ein erster Prototyp geschaffen. Allerdings musste für einen angestrebten Abschluss des Projektes beides in Einklang gebracht werden, Dabei erwies sich ffserver als Sackgasse: Dieses Projekt wurde 2018 eingestellt. Ich musste also erneut auf die Suche gehen...

Zu meiner Überraschung und Genugtuung fand ich eine Alternative in der Benutzung eines Paares aus NGinx und ffmpeg. Damit war ich in der Lage, einen Streaming-Server aufzubauen, der kontinuierlich 720p lieferte und bei der Transkodierung den Server nicht einmal annähernd auslastete. Die Konfiguration von nginx übernahm ich ungeändert aus den diversen Beispielen im Internet, das von mir angepasste und benutzte Kommando zur Speisung mittels ffmpeg lautete:

sudo ffmpeg  -init_hw_device vaapi=foo:/dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi -hwaccel_device foo -i "input" -filter_hw_device foo -vf 'format=nv12|vaapi,hwupload,scale_vaapi=w=640:h=390' -c:v h264_vaapi -preset veryfast -maxrate 1984k -bufsize 3968k -crf 10 -tune zerolatency -g 60 -c:a aac -b:a 128k -ar 44100 -f flv rtmp://localhost/show/stream

für die Auflösung vergleichbar mit der mit ffserver erreichten und

sudo ffmpeg  -init_hw_device vaapi=foo:/dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi -hwaccel_device foo -i "input" -filter_hw_device foo -vf 'format=nv12|vaapi,hwupload,scale_vaapi=w=1280:h=720' -c:v h264_vaapi -preset veryfast -maxrate 1984k -bufsize 3968k -crf 10 -tune zerolatency -g 60 -c:a aac -b:a 128k -ar 44100 -f flv rtmp://localhost/show/stream

für volles 720p.

Alle Artikel rss Wochenübersicht Monatsübersicht Github Repositories Gitlab Repositories Mastodon Über mich home xmpp


Vor 5 Jahren hier im Blog

  • Fährnisse des Buildprozesses unter Windows

    17.07.2019

    Nachdem ich begonnen hatte, mich mit der Beschleunigung der Berechnung des Mandelbrot-Fraktals unter Zuhilfenahme der Shadereinheiten in Graphikkarten zu beschäftigen und erste Erfolge feiern konnte, wollte ich das mal auf einer richtigen Graphikkarte ausprobieren...

    Weiterlesen...

Neueste Artikel

  • Datenvalidierung UTF8 mit BiDi-Steuerzeichen (TrojanSource 2.0)

    Ich bin heute nochmal inspiriert worden, weiter über die Trojan Source Vulnerability nachzudenken. Meiner Meinung nach bestehen hier noch Probleme - speziell bei Nutzereingaben oder Daten, die über externe Schnittstellen ampfangen werden.

    Weiterlesen...
  • OpenStreetMap Navi als Docker-Container

    Ich habe die auf OpenStreetMap basierende OpenSource Navigationslösung Graphhopper in einen Docker-Container gepackt und als neuestes Mitglied in meinem Docker-Zoo willkommen geheißen.

    Weiterlesen...
  • SQL-Aggregatfunktionen in SQLite als BeanShell-Scripts

    Ich habe neulich über eine Möglichkeit berichtet, SQLite mittels der sQLshell und Beanshell-Skripten um SQL-Funktionen zu erweitern. In diesem Artikel versprach ich auch, über eine solche Möglichkeit für Aggregatfunktionen zu berichten.

    Weiterlesen...

Manche nennen es Blog, manche Web-Seite - ich schreibe hier hin und wieder über meine Erlebnisse, Rückschläge und Erleuchtungen bei meinen Hobbies.

Wer daran teilhaben und eventuell sogar davon profitieren möchte, muß damit leben, daß ich hin und wieder kleine Ausflüge in Bereiche mache, die nichts mit IT, Administration oder Softwareentwicklung zu tun haben.

Ich wünsche allen Lesern viel Spaß und hin und wieder einen kleinen AHA!-Effekt...

PS: Meine öffentlichen GitHub-Repositories findet man hier - meine öffentlichen GitLab-Repositories finden sich dagegen hier.