In letzter Zeit habe ich als Hobby die Vorlesungen eines befreundeten Psychologen gefilmt. Das aufgenommene Material schneide ich und veröffentliche es auf meiner Webseite. Vor einem Monat hatte ich die Idee, einen 24/7-Livestream dieser Vorlesungen auf YouTube zu organisieren. Eine Art thematischer „Fernsehsender“, der dem persönlichen Wachstum gewidmet ist.
Ich weiß, wie man einen normalen Stream macht. Aber wie richte ich einen Stream speziell für Videodateien ein? Damit er 24/7 läuft, flexibel, maximal autonom ist und dabei nicht von meinem Heimcomputer abhängig ist. Das wollte ich herausfinden.

Ich habe mehrere Tage damit verbracht, eine Lösung zu finden. Ich habe viele Foren und verschiedene Handbücher studiert, ohne die meine Übertragung einfach nicht möglich gewesen wäre. Und jetzt, wo das Experiment gelungen ist, verspüre ich den Drang, meine Lösung zu teilen. So entstand dieser Artikel.
Kurz gesagt, die finale Lösung sieht folgendermaßen aus: VPS + ffmpeg + Bash-Skript. Im Folgenden beschreibe ich die durchgeführten Schritte und erläutere die „Hürden“, die beim Einrichten des Streams aufgetreten sind.
Schritt 1 – Woher wird der Stream gesendet?
Zunächst musste ich entscheiden, von wo die Übertragung stattfinden soll, wo die Quelle sein wird. Das Erste, was mir in den Sinn kam, war der heimische Computer. Ich plante, Videos in eine Playlist zu sammeln und sie in einem beliebigen Media Player abzuspielen. Dann wollte ich den Bildschirm aufnehmen und auf YouTube streamen. Doch ich habe diese Option schnell verworfen, da es nötig gewesen wäre, den Heimcomputer ständig eingeschaltet zu lassen, was einen Lärm von den Lüftern selbst nachts bedeutet und den Stromverbrauch erhöht (+100-150 kWh pro Monat). Außerdem wäre ein Nutzen des Heimcomputers während der Übertragung nicht möglich, da jede Bewegung der Maus im Stream sichtbar wäre.
Daraufhin begann ich, mich nach Cloud-Diensten umzusehen. Ich suchte nach einem fertigen Service, um meine Videos hochzuladen oder beispielsweise Links zu Videos von YouTube einzufügen, damit alles in einem Non-Stop-Streaming verpackt wird. Leider fand ich nichts Passendes. Vielleicht habe ich nicht gut genug gesucht. Das Einzige, das funktional in Frage kommt, ist restream.io, ein Service, der hilft, gleichzeitig auf mehreren Plattformen zu streamen. Dort kann man anscheinend auch eigene Videos hochladen. Aber dieser Service wurde für ganz andere Zwecke entwickelt und rechnet damit, dass die Übertragung nur ein paar Stunden dauert. Ich glaube, dass, wenn es mit diesem Service gelänge, einen 24-Stunden-Stream zu organisieren, dies mit Sicherheit Hunderte von Dollar im Monat einbringen könnte. Ich wollte jedoch die Übertragung entweder kostenlos oder mit minimalen finanziellen Investitionen organisieren.
Es wurde klar, dass für das Streaming entweder ein separates Gerät oder überhaupt einen eigenen Computer. Ich dachte an etwas wie einen Raspberry Pi. Aber was? Der hat keinen Kühler. Ich habe ein Video auf einen USB-Stick aufgenommen, das Ethernet-Kabel eingesteckt und lasse es einfach an einem ruhigen Ort liegen, während es streamt. Das wäre eine Möglichkeit. Doch weder das Board noch Erfahrung mit ihm hatte ich, daher habe ich auch diese Option verworfen.
Schließlich stieß ich auf eine Diskussion über die Erstellung eines eigenen Servers für das Streaming. Das war nicht ganz das, was ich suchte, aber den Hauptgedanken habe ich verstanden – man kann einen Server verwenden! In der Diskussion wurde vorgeschlagen, eine Kombination aus VPS + nginx + OBS zu nutzen. Mir wurde klar, dass diese Kombination auch für mich geeignet sein könnte. Einzig die Sorge, dass ich nie einen Server administriert hatte und es mir zu kompliziert und teuer erschien, hielt mich zurück. Ich beschloss, herauszufinden, wie viel es kosten würde, einen Server in der minimalen Ausstattung zu mieten, und war angenehm überrascht.

Die Preise sind in belarussischen Rubel angegeben, was nur ein Bruchteil ist. Zum Verständnis: 8 belarussische Rubel entsprechen etwa 3,50 US-Dollar oder 240 russischen Rubel. Für einen Monat Nutzung eines vollwertigen Computers, der rund um die Uhr eingeschaltet ist und einen schnellen Internetzugang hat. Aus irgendeinem Grund hat mich diese Entdeckung sehr gefreut, und ich war einige Tage lang überglücklich, wie ein Kind, das gerade Weltraumraketen entdeckt hat 🙂
Übrigens habe ich das Angebot der ersten Website genutzt, die mir Google bei der Suche nach "VPS mieten" angezeigt hat. Möglicherweise gibt es noch günstigere Lösungen, aber dieser Preis hat mir gefallen, und ich habe nicht weiter gesucht.
Bei der Erstellung des Servers kann das Betriebssystem ausgewählt werden, unter dem er laufen soll. Auf jedem der genannten Systeme kann eine Übertragung organisiert werden, und die Wahl sollte basierend auf Ihren Vorlieben und finanziellen Möglichkeiten getroffen werden (für einen Server mit Windows wird eine zusätzliche Gebühr erhoben). Ich habe mich für CentOS entschieden, einfach weil ich früher ein wenig Erfahrung damit hatte.

Schritt 2 – Serverkonfiguration
Das Erste, was Sie nach der Erstellung eines Servers tun sollten, ist, sich über SSH mit ihm zu verbinden. Anfänglich habe ich PuTTy verwendet, bin dann aber auf die Anwendung Secure Shell App umgestiegen, die in Google Chrome läuft. Das hat sich für mich als bequemer herausgestellt.
Dann habe ich den Hostnamen geändert, die Zeit同步ung auf dem Server eingerichtet, das System aktualisiert, mit iptables herumgespielt... und noch viele andere Dinge getan, nicht weil es notwendig war, sondern weil ich es interessant fand, den Server zu konfigurieren, und ich es gut hinbekommen habe. Ich liebe es, wenn alles klappt 🙂
Hier sind die Schritte, die Sie unternehmen sollten:
- Fügen Sie das EPEL-Repository hinzu.
- Richten Sie den FTP-Server ein (ich habe vsftp gewählt).
- Installieren Sie ffmpeg.
Ich werde die genauen Befehle nicht auflisten, diese Anleitung ist eher konzeptionell, um den allgemeinen Aktionsplan zu vermitteln. Falls Sie bei einem der Schritte auf Schwierigkeiten stoßen, lassen sie sich schnell mit einer Suchanfrage wie „CentOS EPEL hinzufügen“ oder „CentOS FTP-Server installieren“ lösen. Auf den ersten Links finden Sie detaillierte Schritt-für-Schritt-Anleitungen.
Wie bereits erwähnt, benötigte ich eine Kombination aus VPS, nginx und OBS. Der VPS ist bereit. Aber bei den anderen Punkten tauchten Fragen auf. OBS ist ein Programm für Live-Übertragungen, Open Broadcaster Software. Es funktioniert nur mit Streams, das heißt, es nimmt beispielsweise ein Bild von einer Webcam und überträgt es. Oder es nimmt einen Bildschirmaufnahmeschnitt oder leitet einen bereits laufenden Stream auf eine andere Seite weiter. Ich habe jedoch keinen Stream; ich habe nur eine Sammlung von Videodateien, die als Stream umgesetzt werden müssen.
Ich begann, in diese Richtung zu recherchieren und stieß auf FFmpeg. FFmpeg ist eine Sammlung von freien, Open-Source-Bibliotheken, die es ermöglichen, digitale Audio- und Videoaufzeichnungen in verschiedenen Formaten zu erfassen, zu konvertieren und zu streamen.
Ich war sehr überrascht, wie viel FFmpeg kann. Wenn du möchtest, kann es den Ton aus einem Video extrahieren. Wenn du möchtest, kann es einen Videoausschnitt ohne Neukodierung herausschneiden. Wenn du möchtest, konvertiert es von einem Format in ein anderes. Und noch vieles mehr. Bis hin zu der Möglichkeit, dass du ihm eine Datei angibst, er sie in einen Stream umwandelt und selbst auf YouTube sendet. Alles, die Kette ist hergestellt. Es bleiben nur noch einige Feinheiten zu klären.
Schritt 3 – Stream-Einstellungen
Erstelle einen Stream auf YouTube. In diesem Schritt benötigen wir nur den Link und den Streaming-Schlüssel. Auf dem Screenshot unten sind sie rot hervorgehoben.

Weiter laden wir die Videodateien auf den Server, die wir streamen möchten. Tatsächlich ist FTP nur für diesen Schritt erforderlich. Wenn Sie eine andere bequeme Methode zum Hochladen von Dateien auf den Server haben, muss der FTP-Server nicht eingerichtet werden.
Wir übertragen den Stream auf YouTube. Um das Streaming zu starten, müssen wir ffmpeg mit mehreren Attributen ausführen. So sieht der kürzeste Befehl aus, den ich erstellt habe:
ffmpeg -re -i lecture1.mp4 -f flv rtmp://a.rtmp.youtube.com/live2/%КЛЮЧ_ТРАНСЛЯЦИИ% Erläuterung der Attribute-re – gibt an, dass die Datei in einen Stream konvertiert werden soll.
-i – gibt an, welche Datei abgespielt werden soll. Es ist wichtig, dass der Befehl aus demselben Verzeichnis ausgeführt wird, in dem sich die Videodatei befindet. Andernfalls sollte ein absoluter Pfad zur Datei angegeben werden, wie zum Beispiel /usr/media/lecture1.mp4.
-f – legt das Ausgabeformat der Datei fest. In meinem Fall bedeutet dies, dass ffmpeg meine Datei „on the fly“ von mp4 in flv konvertiert.
Am Ende geben wir die Daten an, die wir von YouTube auf der Seite zur Einrichtung des Streams erhalten haben, d.h. die Adresse, an die die Daten gesendet werden müssen, sowie den Streaming-Schlüssel, damit der Stream tatsächlich auf Ihrem Kanal angezeigt wird.
Wenn alles korrekt gemacht wurde, sollte YouTube den übertragenen Stream erkennen, nachdem Sie diesen Befehl ausgeführt haben. Um den Stream zu starten, müssen Sie lediglich die Schaltfläche „Live-Übertragung starten“ in YouTube drücken.
Schritt 4 – Autonomie hinzufügen
Herzlichen Glückwunsch! Jetzt wissen Sie, wie Sie eine Übertragung aus einer Videodatei starten. Aber das reicht nicht für eine 24/7-Übertragung. Es ist wichtig, dass nach dem Ende der Wiedergabe des ersten Videos sofort das nächste gestartet wird, und wenn alle Videos gezeigt wurden, sollte die Wiedergabe von vorne beginnen.
Ich habe folgenden Vorschlag entwickelt: Erstellen Sie eine .sh-Datei, in der ich für jede Videodatei einen Befehl niedergeschrieben habe und am Ende den Befehl für den erneuten Start dieses Skripts angegeben habe. Es entstand eine Art Rekursion:
Befehl 1... (Starten des Streams für die Datei lecture1.mp4)
Befehl 2... (Starten des Streams für die Datei lecture2.mp4)
Befehl 3... (Starten des Streams für die Datei lecture3.mp4)
bash start.shJa, das hat funktioniert. Zufrieden mit mir selbst, startete ich einen Test-Stream und ging schlafen.
Am Morgen erwartete mich eine unangenehme Überraschung. Es stellte sich heraus, dass der Stream nur ein paar Minuten lief und praktisch sofort endete, als ich meinen Computer ausschaltete. Nachforschungen ergaben, dass Befehle, die auf diese Weise gestartet werden, nur ausgeführt werden, solange der Benutzer am Server angemeldet ist. Sobald ich mich abmeldete, wurde die Ausführung meiner gestarteten Befehle unterbrochen. Um das zu vermeiden, genügt es, dem Befehl voranzustellen bash den Befehl nohup. Dadurch kann der gestartete Prozess unabhängig von Ihrer Anwesenheit weiterlaufen.
Die endgültige minimalistische Version des Skripts sieht so aus:
ffmpeg -re -i lecture1.mp4 -f flv rtmp://a.rtmp.youtube.com/live2/%КЛЮЧ_ТРАНСЛЯЦИИ%
ffmpeg -re -i lecture2.mp4 -f flv rtmp://a.rtmp.youtube.com/live2/%КЛЮЧ_ТРАНСЛЯЦИИ%
ffmpeg -re -i lecture3.mp4 -f flv rtmp://a.rtmp.youtube.com/live2/%КЛЮЧ_ТРАНСЛЯЦИИ%
nohup bash start.sh $Wo start.sh die Datei ist, in der dieses Skript gespeichert ist. Diese Datei sollte sich im selben Verzeichnis wie die Videodateien befinden.
Das Hinzufügen des Dollarzeichens am Ende ermöglicht es, den Prozess im Hintergrund auszuführen, damit die Konsole weiterhin genutzt werden kann, ohne das Streaming zu unterbrechen.
Aus den Boni ergeben sich folgende Vorteile:
- Die Wiedergabe von Dateien kann manuell umgeschaltet werden. Dazu muss der aktuell laufende ffmpeg-Prozess beendet werden. Danach startet automatisch die Wiedergabe der nächsten Datei in der Liste.
- Neue Videos können ohne Unterbrechung des Streams zur Übertragung hinzugefügt werden. Laden Sie einfach das Video auf den Server hoch, fügen Sie im Skript den Befehl zum Starten dieser Datei hinzu, speichern Sie es. Und das war's. Bei der nächsten Wiedergabe wird die neue Datei parallel zu den alten Dateien übertragen.
Schritt 5 – ffmpeg weiter anpassen
Hier könnte man im Prinzip aufhören. Ich wollte jedoch die Übertragung etwas benutzerfreundlicher für die Zuschauer gestalten.
Angenommen, eine Person hat sich eine Übertragung angeschaut, fand sie interessant und möchte die Vorlesung von Anfang an ansehen, aber die Übertragung erlaubt kein Vorspulen. Um die Vorlesung von Anfang an zu sehen, muss die Person auf meine Website gehen und die Aufzeichnung der gewünschten Vorlesung abrufen. Wie kann man jedoch verstehen, welche Vorlesung sie interessiert? Auf der Website gibt es bereits 16 Vorlesungen und jede Woche werden es mehr. Ich denke, selbst ich, der all diese Vorlesungen aufgenommen und geschnitten hat, könnte anhand eines zufälligen Auszugs nicht erkennen, um welche Vorlesung es sich handelt. Deshalb muss jede Vorlesung irgendwie gekennzeichnet sein.
Die Option, Beschriftungen in die Original-Videodateien in einem Schnittprogramm hinzuzufügen, war für mich nicht zufriedenstellend. Es musste so gestaltet werden, dass die Originaldateien verwendet werden. Damit die Unterstützung der Übertragung von mir so wenig Aufwand wie möglich verlangt.
Es stellte sich heraus, dass ffmpeg mir auch dabei helfen kann. Es hat ein spezielles Attribut -vf, das es ermöglicht, Text über das Video zu legen. Um Text auf das Video hinzuzufügen, muss der folgende Teil in den Befehl eingefügt werden:
-vf drawtext="fontfile=OpenSans.ttf:text='Vorlesung 13: Psychologie der Emotionen. Wie schafft man Freude?':fontsize=26:fontcolor=white:borderw=1:bordercolor=black:x=40:y=670" Entschlüsselung der Parameterfontfile= – der Link zur Schriftart-Datei. Ohne dies wird der Text nicht zum Video hinzugefügt. Am einfachsten ist es, die Schriftart-Datei im gleichen Ordner wie das Video abzulegen. Andernfalls muss der vollständige Pfad zur Datei angegeben werden.
text= – der eigentliche Text, der über dem Video platziert werden soll.
fontsize= – die Schriftgröße in Pixel.
fontcolor= – die Farbe der Schrift.
borderw= – die Dicke der Kontur um den Text in Pixel (ich habe weißen Text mit einer schwarzen Kontur von 1 Pixel Dicke).
bordercolor= – die Farbe der Kontur.
x= und y= – die Koordinaten des Textes. Der Punkt 0;0 befindet sich in der oberen linken Ecke. Ich habe die Koordinaten so gewählt, dass der Text in der unteren linken Ecke bei einer Videoauflösung von 1280x720 Pixeln erscheint.
So sieht das aus:

Schritt 6 – Bestimmung der Übertragungsqualität
Fertig, die Übertragung ist bereit. FFmpeg sendet, die Dateien werden wiedergegeben, meine Anwesenheit ist für die Übertragung nicht erforderlich. Sogar jede Vorlesung ist beschriftet. Scheinbar alles.
Aber es gibt noch einen weiteren Aspekt – ich habe die minimalste Serverkonfiguration gewählt, und diese konnte die Übertragung nicht bewältigen. Serverkonfiguration: 1 Kern (ca. 2,2 GHz), 1 Gigabyte RAM, 25 GB SSD. Der Arbeitsspeicher war ausreichend, aber die CPU war nahezu durchgehend zu 100 % ausgelastet (zum Teil sogar bei 102-103% 🙂 Das führte dazu, dass die Übertragung alle paar Sekunden stockte. Nicht schön.
Ich hätte einfach eine teurere Konfiguration mit zwei Kernen wählen können, aber dank der Cloud-Technologien erfolgt die Änderung der Serverkonfiguration per Knopfdruck. Ich wollte jedoch innerhalb der Möglichkeiten der minimalen Konfiguration bleiben. Also begann ich, die Dokumentation von ffmpeg zu studieren, und ja, dort gibt es ebenfalls Einstellungen, die die Belastung des Systems regulieren.
Eine hohe Bildqualität kann auf zwei Arten erreicht werden: entweder durch hohe CPU-Belastung oder durch großen ausgehenden Datenverkehr. Das bedeutet, je mehr Last die CPU verarbeiten kann, desto weniger Bandbreite wird benötigt. Alternativ kann die CPU weniger belastet werden, was jedoch einen breiten Kanal mit ausreichend Datenverkehr erfordert. Wenn sowohl die CPU als auch die Größe des ausgehenden Kanals/Datenverkehrs eingeschränkt sind, muss die Bildqualität verringert werden, damit die Übertragung ruckelfrei erfolgt.
Mein Server hat einen Kanal mit einer Bandbreite von 10 Mbit/s. Diese Breite ist ausreichend. Es gibt jedoch eine Traffic-Beschränkung von 1 TB pro Monat. Daher darf mein ausgehender Datenstrom, um innerhalb dieser Begrenzung zu bleiben, nicht mehr als etwa 300 Kbit pro Sekunde betragen, d.h. die Bitrate des ausgehenden Streams sollte maximal 2,5 Mbit/s betragen. Übrigens empfiehlt YouTube genau diese Bitrate für Übertragungen.
Um die Systemlast zu regulieren, verwendet ffmpeg verschiedene Ansätze. Dies wird gut erläutert. . Ich habe letztendlich zwei Attribute verwendet: -crf und -preset.
Constant Rate Factor (CRF) – dies ist der Koeffizient, mit dem die Bildqualität reguliert werden kann. Der CRF kann Werte von 0 bis 51 annehmen, wobei 0 die Qualität der Originaldatei darstellt und 51 die schlechteste Qualität bedeutet. Es wird empfohlen, Werte von 17 bis 28 zu verwenden, wobei der Standardwert 23 beträgt. Bei einem Wert von 17 wird das Video visuell identisch zum Original sein, jedoch technisch nicht so sein. In der Dokumentation steht außerdem, dass die Größe des endgültigen Videos in Abhängigkeit vom angegebenen CRF exponentiell variiert, d.h. eine Erhöhung des Koeffizienten um 6 Punkte führt zur Verdopplung der Bitrate des Ausgangsvideos.
Wenn man mit CRF das "Gewicht" des ausgehenden Bildes anpassen kann, dann kann man mit Presets (-preset) bestimmen, wie stark die CPU belastet wird. Die Parameter dieses Attributs sind wie folgt:
ultrafastsuperfastveryfastfasterfastmedium– Standardwertslowslowerveryslow
Je "schneller" der angegebene Parameter ist, desto höher ist die Belastung der CPU.
Zuerst habe ich ein Preset ausgewählt, das grundsätzlich zu meiner CPU passte, und danach habe ich die Last mit Hilfe von CRF feiner eingestellt. In meinem Fall hat das Preset fast, während ich für CRF auf dem Wert 24 geblieben bin.
Fazit
Das wäre alles. Mein endgültiger Befehl zum Start der Übertragung sieht so aus:
ffmpeg -re -i lecture1.mp4 -vf drawtext="fontfile=OpenSans.ttf:text='Vorlesung 1: Jonglieren mit Weltenbildern':fontsize=26:fontcolor=white:borderw=1:bordercolor=black:x=40:y=670" -c:v libx264 -preset fast -crf 24 -g 3 -f flv rtmp://a.rtmp.youtube.com/live2/%KOSTEN_ÜBERTRAGUNG%Es bleiben nur noch zwei unerklärte Punkte:
1) -c:v libx264 – die Angabe des spezifischen Codecs für die Bearbeitung der Quelldatei.
2) -g 3 – die explizite Angabe der Anzahl der Schlüsselbilder. In diesem Fall ist angegeben, dass jedes dritte Bild ein Schlüsselbild sein soll. Der Standardwert liegt entweder bei 5 oder 8, aber YouTube beschwert sich und verlangt mindestens 3.
Die Qualität der Übertragung kann eingesehen werden .
Die Serverauslastung war wie folgt:


Anhand der Überwachungsdaten sieht man, dass die Auslastung der CPU zwischen 70 % und 95 % schwankt und die Übertragung in der gesamten Woche nie 100 % erreicht hat. Das bedeutet, dass bei diesen Einstellungen die CPU ausreichend ist.
Zur Festplattennutzung kann ich sagen, dass sie fast nicht ausgelastet ist und für die Übertragung sollte sogar eine normale HDD ausreichen.
Das volumen an ausgehendem Traffic besorgt mich. Mein ausgehender Datenstrom schwankt zwischen 450 und 650 Kilobyte pro Sekunde. Das summiert sich im Monat auf etwa 1,8 Terabyte. Möglicherweise muss ich zusätzlichen Traffic kaufen oder auf eine Konfiguration mit zwei Kernen umsteigen, da ich die Qualität des Bildes nicht reduzieren möchte.
***
Zusammenfassend lässt sich sagen, dass die Einrichtung einer solchen Übertragung von Grund auf etwa 1-2 Stunden in Anspruch nimmt. Der Großteil der Zeit wird jedoch für das Hochladen des Videos auf den Server benötigt.
Als marketinginstrument hat der Start einer solchen Übertragung sich nicht bewährt. Möglicherweise würde es funktionieren, die Aufrufe künstlich zu steigern, sodass die YouTube-Algorithmen diese Übertragung aufnehmen und aktiv in den Empfehlungen anzeigen. In meinem Fall wurde sie jedoch in 16 Tagen ununterbrochener Übertragung nur 58 Mal angesehen.
Das ist in Ordnung. Die Übertragung fügte sich harmonisch auf der Hauptseite meiner Website ein. Es bot die Möglichkeit, sich schnell eine Meinung über den Dozenten und die Vorlesungen zu bilden.
Ein weiterer Punkt: Es ist wichtig, dass die Übertragung niemandes Urheberrechte verletzt, da sie ansonsten blockiert werden kann. Ich bin bei meiner Übertragung entspannt, da ich die Musikstücke speziell ausgewählt habe, die frei verwendet werden können, und die Urheberin des Inhalts sitzt am Nebentisch und ist sehr dafür, dass ich ihren Inhalt verwende 🙂
Wenn jedoch im Hintergrund ein Radio spielt, oder wenn Sie während der Bearbeitung Ihren Lieblingssong verwendet haben, oder Videomaterial aus einem beliebten Musikvideo, einer Serie oder einem Film genommen haben, dann ist Ihre Übertragung in Gefahr. Es ist auch wichtig, dass die Übertragung zumindest eine minimale inhaltliche Belastung hat, ansonsten kann sie als Spam blockiert werden.
***
Das wäre alles von meiner Seite. Ich hoffe, dieses Handbuch wird jemandem gute Dienste leisten. Wenn Sie noch etwas hinzuzufügen haben, schreiben Sie gerne, ich freue mich über Ergänzungen und Klarstellungen zum Artikel.
Quelle: habr.com
