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.
Create your own video streaming server with Linux
Linux: set up media server to stream video via the Internet?
ffmpeg wiki: ffserver
OBS Studio
Setting up HLS live streaming server using NGINX + nginx-rtmp-module on Ubuntu
scythargon/nginx stream ffmpeg on the fly
Setting up a multistream Server with Nginx
Setting Up Adaptive Streaming with Nginx
Building a live video streaming website - Part 1 - Start Streaming!
Multi-User-WebDAV, Docker, GitHub
17.11.2019
Nachdem ich mich in letzter Zeit verstärkt mit Docker und dem zugehörigen Ökosystem beschäftige, habe ich begonnen, verschiedenste Dienste in Containern zu testen um zu sehen, ob in manchen Fällen LXC oder KVM nicht doch die bessere Wahl wäre...
Weiterlesen...Android Basteln C und C++ Chaos Datenbanken Docker dWb+ ESP Wifi Garten Geo Go GUI Gui Hardware Java Jupyter Komponenten Links Linux Markdown Markup Music Numerik OpenSource PKI-X.509-CA Python QBrowser Rants Raspi Revisited Security Software-Test sQLshell TeleGrafana Verschiedenes Video Virtualisierung Windows Upcoming...
In eigener Sache...
Weiterlesen...Ich habe eine neue Java Swing Komponente erstellt: Es handelt sich um einen Wrapper für von JToolBar abgeleitete Klassen, die die Werkzeugleiste minimieren und sie nur dann einblenden, wenn der Mauszeiger über ihnen schwebt.
Weiterlesen...Ich habe bereits in einem früheren Artikel über meine ersten Erfolge berichtet, der sQLshell auf Basis des bestehenden Codes aus dem Projekt EBMap4D eine bessere Integration für Geo-Daten zu spendieren und entsprechende Abfragen, bzw. deren Ergebnisse auf einer Kartenansicht zu visualisieren.
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, 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.