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 Codeberg Repositories Mastodon Über mich home xmpp


Vor 5 Jahren hier im Blog

  • Ticketsysteme sind lebende Wesen

    29.03.2020

    Hier zunächst wieder eine Triggerwarnung: Dieser Artikel wird meine Meinung abbilden. es kann sein, dass sie dem einen oder anderen nicht gefällt - das ist mir aber egal. Und wenn hier irgendwelche Schneeflocken mitlesen, dann sind die selber schuld.

    Weiterlesen...

Neueste Artikel

  • Weitere Experimente mit dem Clifford-Attractor

    Ich berichtete hier bereits über Experimente mit dem Clifford-Attractor, allerdings war ich noch Experimente unter geringfügig geänderten Parametern schuldig...

    Weiterlesen
  • Neues Feature in meinem Static Site Generator: externe URLs

    Es wurde wieder einmal Zeit für ein neues Feature in meinem Static Site Generator mittels dessen ich ja auch meine Heimatseite im Zwischennetz gestalte und verwalte...

    Weiterlesen
  • Eine Bestandsaufnahme

    Es kamen mehrere Faktoren zusammen: die Tatsache, dass ich nicht mehr ganz so kürzlich die 50 überschritten habe hatte ebenso darauf Einfluss wie das heutige trübe Wetter und auch der Fakt, dass ich bereits beinahe alle Wochenendpflichten erledigt habe. Der letzte Stein des Anstoßes war dann aber, dass sich heute zum 125. Mal der Geburtstag von Erich Fromm jährt.

    Weiterlesen

jürgen key

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, muss 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 Codeberg-Repositories findet man hier.