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

  • CI/CD mit shellcheck

    13.10.2019

    Ich habe mich entschlossen, in meinen diversen Shell-Projekten shellcheck als Mittel zur Qualitätssicherung einzusetzen.

    Weiterlesen...

Neueste Artikel

  • Linux-System SBOM visualisiert als Graph

    In meinem $dayjob kam neulich die Frage auf, ob es möglich wäre, die aktuelle Softwareinstallation eines Linux-Systems als Software Bill of Materials (SBOM) zu exportieren.

    Weiterlesen...
  • Visualisierung von Datenmodellen als gerichtete Graphen

    Ich habe - motiviert durch meine Experimente zur Visualisierung von Paketabhängigkeiten in Linux-Installationen als interaktive Graphen - versucht, relationale Datenmodelle in ähnlicher Form zu visualisieren und dazu zwei Plugins für die sQLshell geschrieben.

    Weiterlesen...
  • Carl Sagan - Christmas Lectures at the Royal Institution

    Die Royal Institution hat in ihren Schätzen gegraben und die Christmas Lectures von Carl Sagan auf Youtube nochmals veröffentlicht. Meiner Ansicht nach unbedingt lohnenswert für alle, die Englisch verstehen!

    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.