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

  • AtomicInteger vs. Integer

    24.03.2019

    Ich habe am Wochenende wieder einmal mit Java-Benchmarks experimentiert

    Weiterlesen...

Neueste Artikel

  • Konstruktive Geometrie mit dem Computer

    Ich habe in einem vorhergehenden Artikel beschrieben, dass ich eine weitere neue Graphik-Primitive erstellt habe. Dabei musste ich mir meine verschütteten Trigonometrie-Kenntnisse wieder vor Augen führen - mit Bleistift und Papier. Das müsste doch auch anders gehen dachte ich mir und begann...

    Weiterlesen...
  • GitHub-Projekte

    Mal abgesehen von den anderen Links, die ich in unregelmäßigen Intervallen hier poste kommt heute ein Schwung (aus meiner Sicht) interessanter/skurriler Projekte auf GitHub:

    Weiterlesen...
  • Mehrere Datenbanken und Postgis-Erweiterung in Docker

    Ich hatte ja schon beschrieben, dass ich mich in diesem Jahr wieder intensiver um mein Geoinformationssystem EBMap4D kümmern möchte. Dazu habe ich jetzt einige infrastrukturelle Vorbereitungen getroffen...

    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.