14. Jun 2013 09:06
5 Kommentare

Screen Sharing

Viele populäre Webkonferenzanbieter bieten sog. Screen Sharing oder auch Desktop Sharing, also das Teilen des eigenen Bildschirms mit Anderen. Hierbei kann man an seinem Bildschirm arbeiten und die "Gäste" können den eigenen Bildschirm sehen und einem dabei zuschauen. Diese Systeme zeichnen sich zusätzlich dadurch aus, dass man keine besondere Software installieren muss. In vielen Firmen können bzw. dürfen einfache Nutzer ohnehin keine eigene Software installieren.

Screen Sharing von Linux zu Windows
Screen Sharing von Linux zu Windows

In meinem vorigen Artikel befasste ich mich bereits mit dem Thema kostenlose Telefonkonferenz mit Asterisk. Da zu Webkonferenz neben der Telefonkonferenz auch noch das sog. Screen Sharing gehört, werde ich mich in diesem Artikel damit auseinandersetzen, wie man unter Linux mit Hilfe von FFmpeg, dem CRTMPServer bzw. alternativ dem FFServer von FFmpeg, einem Browser und dem Flash-basierten JWPlayer den Bildschirminhalt per Live Streaming auf andere Rechner bringt.

Was man für Screen Sharing braucht

Einige werden sicher wissen, dass man mit dem VLC Player bereits einfach den Bildschirm streamen kann, indem man als Netzwerkquelle "screen://" angibt und dann das übliche Streaming durchführt. Schwupps, schon hat man Screen Sharing mit VLC. Klingt einfach und schnell, bringt im lokalen Netzwerk auch sofort den gewünschten Effekt. Problematisch wird es bei dieser Methode, wenn man den Bildschirminhalt mehreren Nutzern außerhalb des eigenen Netzwerks anbieten möchte.

34,90 €
Jetzt bestellen »
Web-TV - AV-Streaming im Internet
Gewöhnlich versandfertig in 24 Stunden

Man könnte da jetzt Firewallfreigaben machen und die externen Nutzer den eigenen Stream ansehen lassen. Da jedoch Kabel- und DSL-Internetanschlüsse häufig nur einen sehr geringen Upload haben, wird es bei Webcasts mit Screen Sharing für 40 Personen schon eng. Rechnet man mit 150 Kbit/s pro Nutzer, dann kommt man bei 40 Personen auf 6 Mbit/s. Das bieten nur die wenigsten Anbieter in voller Geschwindigkeit.

In diesem Beitrag erläutere ich, wie man mittels FFmpeg einen Bildschirminhalt zwecks Screen Sharing an den CRTMPServer oder den FFServer übertragt, damit dieser dann auf einem virtuellen oder Root-Server den Stream an die Nutzerschaft übertragt. Da Server bei den meisten Hostern eine 100 Mbit/s Leitung bereitstellen, wird es auch erst ab 500 - 600 Nutzern eng mit der Bandbreite. Wer dann mehr braucht, kann auch mehrere Server über Load Balancer aussteuern. Schauen wir jedoch zunächst einmal, was benötigt wird. Bei mir zu Hause in meinem kleinen Beispiel läuft das alles auf meinem Raspberry Pi.

  1. Ein Server mit je 150 Kbit/s pro Betrachter und 1x 150 Kbit/s für den Eingangsstream sowie darauf installiert den Apache Webserver, den CRTMPServer und/ oder den FFServer sowie den kostenlosen JWPlayer
     
  2. Am Computer, dessen Bildschirm über Screen Sharing freigegeben werden soll, benötigen wir Linux (OSX oder Windows ginge mit Anpassung der nachfolgenden Befehle auch) sowie eine Internetleitung mit mindestens besagten 150 Kbit/s im Upload sowie einen Prozessor, der möglichst zügig h264 enkodieren kann - es muss wohl nicht erwähnt werden, dass FFmpeg installiert sein sollte

Hat man diese Voraussetzungen erfüllt, kann es auch schon losgehen mit der Konfiguration des CRTMPServers für das Streaming unseres Bildschirms für das Screen Sharing. Für das Streaming stellt der CRTMPServer das Kernstück dar. Im Anschluss an den CRTMPServer widmen wir uns dann auch als Vergleich der Konfiguration des FFServer für Screen Sharing.

28,39 €
Jetzt bestellen »
Logitech C270 Webcam (720p Videoqualität) schwarz
Versandfertig in 1 - 2 Werktagen

Konfiguration des CRTMPServer für Screen Sharing

Der CRTMPServer ist ein C++ RTMP Server, welcher das ehemals properitäre und mittlerweile öffentliche RTMP Protokoll von Adobe verwendet. Dieses wird von nahezu allen gängigen Flash Videoplayern wie dem JWPlayer unterstützt und bietet die Möglichkeit nahezu in Echtzeit Videos zu streamen. Der Nachteil ist jedoch, dass das Streaming häufig nur in Verbindung mit solchen Flash Video Playern funktioniert. Es gibt zwar auch Player, die RTMP Video-Streams unter Android oder Apple iOS abspielen können, es kann jedoch meiner Erfahrung nach hier zu Einschränkungen kommen.

Im Ordner "/etc/crtmpserver/applications/" befindet sich die Datei "flvplayback.lua", die grundsätzlich bereits eine entpsrechende Konfiguration aufweist. Da brauchen wir auch nicht mehr groß dran herumarbeiten. Die Anwendung "flvplayback" funktioniert bereits. Einzig mit der Absicherung durch Benutzernamen und Passwort bin ich mit CRTMPServer nicht sonderlich weit gekommen, ein Beispiel befindet sich zwar in der gleichen Datei mit dem Abschnitt "authentication", jedoch schien FFmpeg beim Streaming an den CRTMPServer damit nicht zurecht zu kommen. Den folgenden Abschnitt mit dem Ordner für FLV-Dateien sollte man jedoch anpassen.

Dieser Eintrag legt fest, wo FLV Dateien liegen, die CRTMPServer anbieten soll. Das ist jetzt für unser Screen Sharing erstmal komplett egal, aber hilfreich um dem CRTMPServer erstmal zu testen. Ich habe mir da eine FLV Testdatei hinkopiert und dann mit dem JWPlayer erstmal per RTMP abgespielt, um zu gucken ob alles grundsätzlich funktioniert.

Installation und Konfiguration von JWPlayer und Apache

Damit der Benutzer bzw. Betrachter nicht noch zusätzliche Software installieren muss und das System einfach zu bedienen ist, verwenden wir eine Web-Oberfläche mit Hilfe des Apache Webservers und des kostenlosen, aber nicht Open Source, JWPlayer. Nachdem wir JWPlayer heruntergeladen haben, haben wir in der ZIP Datei die entsprechenden JavaScript und Flash-Dateien.

Die HTML Datei, in der der Screen Sharing Stream und der JWPlayer konfiguriert ist, sieht dann wie folgt aus . JWPlayer ist für die RTMP-URL "rtmp://redbox/live/screen" konfiguriert. RedBox ist der Hostname meines Raspberry Pi, live steht als Synonym für die "flvplayback"-Applikation und screen ist der Stream, den wir zwecks Screen Sharing an den CRTMPServer übertragen.

Damit ist die kleine Webanwendung für das Betrachten des Bildschirms - also die eigentliche Screen Sharing Anwendung vollständig. Alles, was wir jetzt noch brauchen ist der Bildschirm, der an den CRTMPServer übertragen wird. Dazu schauen wir uns nachfolgend FFmpeg im Zusammenspiel mit dem CRTMPServer an. Bezügliches des Testens, ob der JWPlayer hier so funktioniert kann man im "mediaFolder" Ordner auch eine FLV Datei ablegen und die URL entsprechend anpassen: "rtmp://redbox/live/meinfilmchen.flv". Damit kann man ohne eingehenden FFmpeg Stream schonmal prüfen, ob die FLV Datei so gestreamt wird.

Screen Sharing mit FFmpeg an CRTMPServer

Kommen wir also nun zum eigentlichen Screen Sharing mit FFmpeg. FFmpeg ist ein sehr umfangreiches Programm und gilt als die Mutter der Konsole, da die Anzahl verfügbarer Parameter absolut enorm ist. Genauso umfangreich ist jedoch auch die Funktionalität. Mit folgendem Befehl bringen wir FFmpeg dazu mit x11grab den Bildschirm aufzunehmen und mittel libx264 in den H264 Videocodec zu enkodieren, das ganze in FLV zu verpacken und per RTMP an den Server zu streamen.

Schauen wir uns die Paramter eimal genauer an, da es hier ein paar Besonderheiten gibt, die zu berücksichtigen sind. Insbesondere die Transkodierung des X11 Bildschirms muss hier in der Framerate dem Stream entsprechen, da es sonst bei der Übertragung zu Verzögerungen kommen kann.

Gibt an, dass das Bild von X11 (der Desktopumgebung) aufgenommen werden soll in einer Bildfläche von 1440x900 Pixel. Das ist bei mir die volle Auflösung. Es gibt auch die Möglichkeit nur bestimmte Bereiche des Bildschirms aufzunehmen. Hierzu sollte man die FFmpeg Dokumentation kunsultieren.

-re gibt an, dass die Framereate der Eingabe der im nachfolgenden Encoder entsprechen soll. Hiermit vermeiden wir Verzögerungen und unschöne Videoeffekte, die auftreten, wenn die Framerate nicht stimmt.

Wir geben hier an, welcher Bildschirm aufgenommen werden soll. Bei mehreren Bildschirmen gibt man die entsprechende X11 Bildschirmidentifikation an.

Gibt an, dass wir 96k Audio-Bitrate und zwei Audiokanäle (audio channels) verwenden. Das ist der Standard für Flash-Video und dabei sollte man es einfach belassen.

Hier definieren wir, dass wir die libx264 verwenden, um h264 Videodaten aus unseren X11 Rohdaten zu enkodieren.

Mit CRF 10 geben wir an, dass wir eine konstante Framerae von 10 erzielen wollen. Das Preset "fast" versucht schnellstmöglich, aber nicht mit bestmöglicher Qualität, zu enkodieren. Würde man eine DVD enkodieren, würde man nicht fast verwenden, da das Enkodieren nicht in Echtzeit ablaufen muss. Bei uns muss es natürlich für das Screen Sharing so schnell wie möglich sein.

Für den FLV-Stream verwenden wir neben dem H264 Videocoded den Mp3 Audiocoded, der jedem bekannt sein sollte. Dieser enkodiert mit einer Audioratew von 44.100 Hertz.

Als ich die ersten Screen-Sharing-Tests gemacht habe, bekam ich nur ein schwarzes Bild im JWPlayer. Der Hintergrund war, dass standardmäßig das falsche Pixelformat eingestellt war. Für den JWPlayer und FLV Streams soll man das Pixel-Format yuv420p verwenden und genau das gibt der Parameter an.

FFmpeg kann in mehreren Threads gleichzeitig mehrere Stückchen des Stroms enkodieren. Mit dem Parameter 0 wird die optimale Anzahl verwendet.

Wohlgemerkt haben wir oben bereits den Parameter -s für die Angabe der Bildschirmgröße für x11grab gehabt. Dieser s-Parameter gibt die Videogröße an und ist damit ausschlaggebend für die Videobitrate und Qualität. FFmpeg wird den Bildschirminhalt von 1440x900 Pixel auf 640x400 herunter skalieren.

Zu guter letzt geben wir FFmpeg die Information, dass die Ausgabe nicht in eine Datei erfolgt sondern als FLV container per RTMP an unseren Server.

Mit den ganzen Parametern ist FFmpeg dann bereit das Video an den RTMP Server zu streamen, von wo aus wir uns dann mit dem JWPlayer auf unserem Apache das Video unseres Desktops ansehen können. Wir stellen dazu sicher, dass der CRTMPServer auf unserem Server läuft und auch der Apache. Zuerst geben starten wir dann mit FFmpeg das Streaming und danach öffnen wir auf dem Computer, der den Stream betrachten soll, den Apache Server im Browser. Das ganze habe ich in folgendem Video auch noch einmal festgehalten.

Wie im Video zu sehen ist, haben wir jetzt mit CRTMPServer, FFmpeg, JWPlayer und Apache eine vollwertige Screen Sharing Lösung zusammen gebaut, die zudem für den streamenden Client auch durch die gängigen Firewalls hindurch funktioniert. Zum Video ist noch anzumerken, dass dies etwas zeitverzögert auf dem Zielrechner läuft, da ich die korrekte Framerate nicht eingestellt hatte.

Einzig die Benutzername/ Passwort Authentifizierung mit dem Adobe-Verfahren beherrscht der FFmpeg nicht, sodass man sich andere Sicherungsmaßnahmen ausdenken muss. Der Stream funktioniert zudem nur mit Flash und somit nicht auf iPads, Androids und anderen Geräten, bei denen Flash nicht installiert ist. Aus diesem Grunde widme ich mich auch dem Screen Sharing bzw. Streaming mit FFServer per HTTP.

Screen Sharing mit FFmpeg an FFServer

Da der CRTMPServer zwar einen guten Job macht, man ihn aber mit Bordmitteln und aufgrund der  eingeschränkten Dokumentation jedoch nicht sehr gut absichern kann, habe ich mich auch nochmal mit dem FFServer von FFmpeg befasst. Hier habe ich zudem das HTTP Protokoll anstelle von RTMP verwendet. Das hat auch den Vorteil, dass der Screen Sharing Stream auf allen möglichen Geräten einwandfrei läuft und sogar direkt im Chrome und Firefox Browser.

Die FFServer Konfiguration sieht für das Streaming von Flash-Video über den FFServer wie folgt aus. Als Anmerkung zu meinem Raspberry Pi sei noch zu sagen, dass die FFServer Version auf ARM Prozessoren scheinbar Schwierigkeiten hat und noch über zahlreiche Bugs verfügt. Es wird empfohlen die neueste Version aus dem FFmpeg trunk selbst zu kompilieren. Zum Testen habe ich meinen x86_64 Rechner mit OpenSUSE verwendet.

Die obige Konfiguration von FFServer funktioniert recht einfach. Es gibt Feeds und Streams, wobei Feed den Eingangsvideostrom bezeichnen, der von unserem Screen Sharing Rechner kommt, während der Stream den Eingangsstrom transkodiert und für das Streaming bereitstellt. Der entsprechende Aufruf für FFmpeg sieht dann wie folgt aus.

Jetzt stellt man auf den ersten Blick gleich fest, dass der Aufruf ja bedeutend kürzer ist als bei der Verwendung mit CRTMPServer. Das ist dadurch bedingt, dass wir den Eingangsstrom nicht vorher transkodieren können, sondern der FFServer das selbst übernimmt.

Screen Sharing FFServer Android
Screen Sharing FFServer Android
Das ist etwas unglücklich, da zum Einen der Eingangsstrom bedeutend größer ist und zum Anderen wir die volle Last der Videoenkodierung auf dem FFServer haben und nicht auf den Client verlagern können. Bei mehreren Eingangsdatenströmen kann das eine nicht zu unterschätzende Belastung des Servers werden. FFmpeg selbst bietet zwar eine Video-Codec Einstellung namens "copy", bei welcher der Eingangsstrom einfach kopiert wird, aber dieses Feature befand sich beim Schreiben des Artikels noch auf der Feature-Wunschliste des FFServer.

Der Vorteil des FFServers hier gegenüber dem CRTMPServer ist jedoch auch, dass er jedwede Videoströme akzeptiert, sehr schnell ist und HTTP Streaming beherrscht, womit er auf alle möglichen Geräte wie z.B. Android Tablets, Smartphones, iPads, iPhones und TV-Geräte streamen kann. Das Bild zeigt das Motorola Xoom mit dem MX Player, welches den FLV Live Stream abspielt.

Entwicklung von Webkonferenzen mit PHP

Mit dem Screen Sharing und der kostenlosen Telefonkonferenz mit Asterisk ist es nicht mehr weit zum fertigen Webkonferenzsystem. Sowohl Asterisk als auch FFServer lassen sich unter Linux einwandfrei auch über eigene Applikationen steuern. Wie man Asterisk steuert habe ich meinem Artikel zur Telefonkonferenz beschrieben. Für FFServer kann man hier Apaches mod_proxy für einen Reverse-Proxy auf den FFServer verwenden, um HTTP Authentifizierung und ggfls. Verschlüsselung durchzuführen. Dazu noch ein netter Player für das Screen Sharing, eine GUI und schon hat man ein eigenes System fertig.

28,39 €
Jetzt bestellen »
Logitech C270 Webcam (720p Videoqualität) schwarz
Versandfertig in 1 - 2 Werktagen

Alternative Verwendung von FFServer und CRTMPServer

Screen Sharing muss nicht das einzige Anwendungsgebiet sein. Obwohl wir uns hier in dem Artikel hauptsächlich mit Screen Sharing beschäftigt haben, ist es vollkommen egal welche Art von Audio/Video Datenstrom man an den CRTMPServer oder den FFServer sendet. Das kann ein für das Tablet vom NAS transkodiertes Video sein, die eigene Webcam, ein TV-Signal oder einfach die Kamera an der Türklingel (sofern man so etwas besitzt). Live Streaming wird immer populärer und so werden auch die Systeme immer ausgereifter. Lediglich der hohen Anforderungen an die Bandbreite sollte man sich permanent bewusst bleiben und das sind seine Planungen einkalkulieren. Mit Sicherheit wird es hier in Zukunft noch viele weitere Artikel zu Thema Videostreaming geben, da das Thema unglaublich beliebt und stark nachgefragt ist. Insbesondere mit dem wachsenden Smart-TVs. Wir werden sehen was die Zukunft der Streaming-Technik bringt.

Bücher zum Thema „Linux Server“

Die nachfolgenden Bücher behandeln das Thema "Linux Server" und werden von Amazon empfohlen. Viele dieser Bücher habe ich selbst gelesen und teilweise auch zur Recherche für diesen Artikel genutzt.
49,90 €
Jetzt bestellen »
Linux-Server: Das umfassende Handbuch. Backup, Sicherheit, Samba 4, Kerberos-Authentifizierung, IPv6 u. v. m.
Dirk Deimeke, Rheinwerk Computing
19,90 €
Jetzt bestellen »
Linux Kommandoreferenz: Shell-Befehle von A bis Z
Michael Kofler, Rheinwerk Computing
44,90 €
Jetzt bestellen »
Linux-Server: Das umfassende Handbuch. Backup, Sicherheit, Samba 4, Kerberos-Authentifizierung, IPv6 u. v. m.
Dirk Deimeke, Rheinwerk Computing
49,90 €
Jetzt bestellen »
Linux-Server: Das umfassende Handbuch (Galileo Computing)
Dirk Deimeke, Galileo Computing

Diese Artikel könnten Dich auch interessieren

Besucher, die diesen Beitrag gelesen haben, haben sich auch die unten aufgeführten Beiträge angesehen. Schau' doch einfach mal in die Artikel rein.
4 Besucher haben auch das gelesen
2 Besucher haben auch das gelesen
1 Besucher haben auch das gelesen
1 Besucher haben auch das gelesen
1 Besucher haben auch das gelesen
1 Besucher haben auch das gelesen

Kommentare zum Thema „Screen Sharing“

Wenn Du möchtest, kannst Du hier Kommentare zum Thema hinterlassen und Dich mit anderen Nutzern austauschen. Damit Du kommentieren kannst, musst Du Dich nur anmelden und schon kann es losgehen.
05.08.2015 10:07
Ich habe die Konfiguration übernommen unf fertig installiert . Die ersten 1 1/2 Minuten geht alles gut danach bekomme ich in ffmpeg folgende Fehlermeldung:[flv @ 0x3a47aa0] rc buffer underflow [flv @ 0x3a47aa0] max bitrate possibly too small or try trellis with large lmax or increase qmaxich habe die beiden Alternativen ausprobiert aber nichts hilft.Woran könnte das liegen?Habe die aktuellste Version von ffmpeg/ffservermein ffmpeg command lautet: ffmpeg -f x11grab -s 1920x1080 -r 20 -i :0.0+1680,0 "http://mein.server:8090/input.ffm"Was kann ich tun um dies zu lösen?
09.08.2015 11:11
Hallo efinder2! Der Buffer underflow wird durch ein viel zu großen Datenstrom erzeugt. Du hast zwar mit "-s 1920x1080" die Eingabegröße bzw -auflösung des Videos angegeben, nicht aber die Ausgabegröße. Du kannst nicht so einfach 1080p durch deinen Server boxen, wenn er dafür nicht genügend Leistung hat oder die Leitung zu schwach ist. Vg, Jan
11.08.2015 09:47
Vielen Dank für deine Antwort.Im Artikel werden 1440x900 Pixel durchgejagt. An der Verbindung und dem Prozessor kann es nicht liegen. Nicht einmal ein CPU-Kern geht auf über 50%. Die Leitung ist Hausintern auf Gigabit-Basis.Wenn ich die Auflösung runterstelle (kleineren Bereich übertrage), verzögert es nur die Fehlermeldung.Wie kann ich die Ausgabe Größe definieren?Vg, Daniel
11.08.2015 10:00
Hi efinder2, im Artikel werden nicht 1440x900 durchgejagt. Das ist die Basisauflösung von meinem Desktop. Der Befehl ist "ffmpeg -f x11grab -s 1440x900 -re -i :0.0 -ab 96k -ac 2 -vcodec libx264 -crf 10 -preset fast -acodec libmp3lame -ar 44100 -pix_fmt yuv420p -threads 0 -s 640x400 -f flv "rtmp://redbox/live/screen" wobei der zweite Parameter "-s" als Augabeauflösung 640x400 Pixel festlegt. Aber das löst ja dein Problem nicht, sondern verzögert es ja nur. In der Mailingliste von FFmpeg gab es dazu auch Kommentare: https://ffmpeg.org/pipermail/ffmpeg-user/2012-April/006058.html Hast Du diesbezüglich mal en Parameter "maxrate" mit entsprechenden Raten getestet? Ist hier beschrieben: https://trac.ffmpeg.org/wiki/EncodingForStreamingSites Probiere dann auch bufsize und rechne mal die Raten durch, die Du da verwendest. Zudem setze auch die Outputparameter explizit, d.h. Audio-Codec, Rate, Videorate etc. pp. Das sollte eigentlich helfen.
11.08.2015 11:25
Ich arbeite mit der 2. Lösung ohne den CRTMPServer. Ich streame von ffmpeg direkt an den ffserver der im firmeninternen Rechenzentrum steht. Die Parameter hatte ich größten teils schon durch probiert. In der letzten Lösung ist aber keine End-Auflösung angegeben.Meine ffserver Konfiguration sieht wie folgt aus:\File /var/ffserver/input2.ffmFileMaxSize 20MACL allow 130.10.0.0 130.10.255.255ACL allow 127.0.0.1\\Feed input2.ffmFormat swfVideoCodec flvVideoFrameRate 20VideoBufferSize 80000VideoBitRate 250VideoQMin 1VideoQMax 5VideoSize 1920x1080PreRoll 0StartSendOnKeyNoAudio\GrüßeDaniel
Jetzt zum Kommentieren anmelden