Also, was mir phantastisch Spaß macht, ist der VLC-Media-Player. Wenn man sich das Mal anschaut, kann man auf:
http://www.ituenix.de:8081/webcam.ogg
http://www.ituenix.de:8082/webcam.ogg
http://www.ituenix.de:8083/webcam.ogg
http://www.ituenix.de:8084/webcam.ogg
http://www.ituenix.de:8085/webcam.ogg
gehen. Da findet man Livestreams vom VLC - Video Lan Client, erzeugt. Das Interessante ist jetzt, diesen Zusammenhang erst ein Mal von anderem ab zu grenzen. Es gibt Streaming-Dienste, wie Zoom. Diese stellen quasi Server oder Dienste dar, die einen Haufen von Leuten "sammeln", die sich dafür mit Clients mit dem Server verbinden, die zum Server Livestreams liefern. Man muss sich den Unterschied klar machen: In diesem Fall hat man einen Server und der eigene Stream geht mitteös der entsprechenden App oder dem Web-Interface zum Server, von wo aus der Stream überall in der Welt zu sehen ist.
Eigentlich können wir selber unbegrenzt streamen, auch in Bezug auf die Möglichkeiten betreff unserer Mittel. Es gibt ca. 4.000.000.000 IPv4-Adressen. Eigentlich sind es 1024*1024*1024*4, wenn man es genau nimmt und wir gehen davon aus, dass wir kein IPv6 benutzen. Das wären erheblich mehr. Letzten Endes sind es bei IPv4 das 32 Bit.
Und: Ich sage so, der "Befehl" den Video Lan Client - den wir jetzt als eine Art Media Player betrachten werden, so zu starten, dass er livetreamt. ist:
vlc v4l2:// :input-slave=alsa:// :v4l2-standard=1 :v4l2-dev=/dev/video1 :v4l2-width=1280 :v4l2-height=720 :sout="#transcode{vcodec=theo,vb=1000,acodec=vorb,ab=128,channels=2,samplerate=44100}:http{dst=:8081/webcam.ogg}" -I dummy
Wie Sie sehen, ist das ein verdammt komplizierter Befehl. Ich kann mir den nicht merken. Ich frage immer das Gedächtnis der bash. Der Befehl muss nicht als super user/root ausgeführt werden, auch, wenn er auf die Hardware direkt zugreift, nämlich /dev/video1
Und, wenn man in der bash, das Gedächtnis abrufen will, dann drückt man die Pfeil-Nach-Oben-Taste. Dann kommen nach der Reihenfolge, in der wir die Befehle eingegeben haben, eben die letzten Befehle. Das sind aber viele. Und Linux merkt die sich. Es gibt in Linux keine eindeutige Shell, die jetzt verwendet werden müsste - das heißt es gibt kein eindeutig festes Programm - das Normale allerdings ist die bash. Alle Shells, man könnte sagen Konsolen, können unterschiedlich sein - auch in ihrem Verhalten - normal ist die bash - Bourne Again Shell. Was Sie, auf dem Bild sehen, ist die Bash.
Das Interessante insofern ist - genau das lernt man auch beim Programmieren - dass das so nicht ist - wissen Sie, wir sind das zum Beispiel gewöhnt, wenn wir mit Bildern und Filmen zu tun haben - dann, genau dann nämlich ist auf dem Bildschirm automatisch ein Bild. Das muss es aber nicht! Sie können sich ein Eingabegerät vorstellen, wie eine Webcam, nämlich
/dev/video0
/dev/video1
/dev/video2
...
und nun können Sie sich vorstellen, Sie nehmen ein Bild von so einem Gerät (Device = Gerät) auf. Und das Bild wird Pixel für Pixel aus der Matrix der Webcam gelesen und einer Datei gespeichert. Die Datei ist insofern interessant: In einer Datei gibt es nur lineare Folgen von Zeichen. Das heißt, eine lange "Liste" quasi "aaaaaa", aber es gibt keine Zeilen und Spalten. Es ist also eindimensional. Und trotzdem: Sie können Zeilen und Spalten bauen. Nämlich indem sie sagen: Nach 512 Zeichen beginnt die neue Zeile. Und: So ist das auch bei Videos. Sie können Videos aufzeichnen, indem sie die Webcam auslesen und dann in einer Datei speichern. Dafür muss es allerdings kein graphisches Benutzerfrontend da sein! Das könnte eine Datei sein - in der sie wohlgemerkt "linear" speichern.
Ich sage mal so: Das Speichern von Bildern, ich meine jetzt nicht mit einem fertigem Programm, sondern programmiertechnisch, hat, wenn wir BMP's - BMP steht für Bit Map - Ähnlichkeit mit den Techniken der Pointelitischen Maler, die pro Einheit, einen Pinselpunkt machen. Das ist in der Informatik nicht anders. Das ist letzten Endes kein Ding mit den Bitmaps das zu programmieren und auch bzw. zusätzlich die Webcam aus zu lesen, das lässt sich auch programmiertechnisch realisieren - ohne Schwierigkeiten.
Dafür ist in Linux die Bibliothek v4l da. Wenn sie v4l oder v4l2 sehen, unter Linux, dann wissen Sie: Das ist die Graphikbibliothek für die Webcams.
Jetzt ist es so: Sie können ihr eigenes Videoformat entwickeln. Sie müssen einfach einen Haufen Bitmaps speichern und ein Programm schreiben, was nach jedem Bitmap nach einem Zeitintervall das nächste zeigt.
Das in sich ist kein Problem. Und spielt keine Rolle. Es ist nicht eine Frage dessen, ob es gelingt, einen Film dar zu stellen, oder ein Graphikformat zu entwickeln, was zum Beispiel dafür sorgt, dass die Dinge gut 3D aussehen. Das darf man nicht verwechseln. Die Bildformate und Video-Format haben nichts damit zu tun, dass die Darstellung von Bild und Video nachher noch schlimmer ist, als von der aufgenommenen Kamera, sei es durch Effekte.
Das entscheidende ist: Alle Formate: Wie JPEG, GIF, PNG, MP3, MPEG, MP4, haben nur ein Ziel. Das die Kompression. Sagen wir ein Bild ist 1 MByte groß. Bei 25 Bildern (1s) haben Sie 25MByte. Bei 60 Sekunden Film haben Sie: 1500 MByte. Das heißt, eine Minute Film, mehr als ein Gigabyte. Das geht nicht. Diese Formate dienen alle nur der Kompression. Und das Ziel ist dann, obwohl Kompression da ist, dass diese nicht spührbar ist. Dass heißt, wenn ich komprimiere gehen unter Umständen Daten verloren. Und das soll aber nachher nicht so aussehen.
Und das Lustige ist: Zum Beispiel gibt es unter Linux, das Programm VLC. Das erste
(1.) Das Programm kann ganz ohne Graphik gestartet werden, alleine über die Bash
(2.) Das Programm selber hat nicht alle Graphikbibliotheken selber implementiert. Das heißt es gibt unter Linux Bibliotheken, wie zum Biespiel v4l2, was die Webcam bedient, als auch zum Beispiel ffmpeg. Man spricht von Codecs. Diese Codecs tun das, wie ihr Name sagt: Sie Codieren und Dekodieren. Sie sind Coder und Decoder. Und ffmpeg ist eines davon. Wenn Sie jetzt VLC-Programmierer sind, da müssen Sie nicht den gesammten VLC bis zum letzten Pixel programmieren, sondern sie verwenden vorhandene Codecs. Sie können auch ihre eigenen Codecs, auch für VLC verwenbar, schreiben. Wenn sie 25 1MByte große BMP's hintereinander stellen, können sie einen Codec schreiben, der das realisiert und welcher auch von VLC benutzen kann. Die Codecs müssen normalerweise zu VLC oder in VLC hinein gesondert installiert werden.
Auch für Darstellung gilt: Sie sehen bie VLC, wenn sie ihn nun doch im "graphischen Modus" starten, ein Bild. Es gibt die Bibliothek Qt4 oder inzwischen Qt5. Diese erlaubt die Darstellung von Bildern und JPEG's zum Beispiel im Fenster. Wobei das fenster auch mit Qt4 oder Qt5 zum Beispiel gemacht wird.
Und das Lustige ist jetzt der Befehl:
1.) Ich benutze das Quelloffene Format ogg. Und das hat zwei Gründe
a.) ogg ist quasi die Alternative zum mp4 bei kommerziellen Betriebssystemen. Das heißt, es ist quelloffen. Was mit Lizenzen zu tun hat und so weiter. Und ich benutze das schon deswegen, weil ich Linux benutze. Und das unterstütze ich und da stehe ich dahinter. Und wenn sich die Leute das angucken wollen, dann sollen Sie sich das halt mit einer Software, angucken, die das kann. Das heißt entweder Firefox - nicht immer - ich habe die Erfahrung gemacht, dass Firefox das unter Windows wiedergeben konnte und dass es das unter Windows nicht konnte. Da muss man eventuell Plugins installieren. Und: Trotzdem Firefox ist quelloffen. Und damit geht das generell.
Mit VLC geht das so oder so. VLC ist auch für Windows zu haben. Und wenn man VLC graphisch startet, das heißt nicht über die Konsole, dann kann wie beim Texteditor, Datei öffnen, eine Quelle angeben. Das kann auch ein Netzwerkwerkstream sein, wie
http://www.ituenix.de:8081/webcam.ogg
b) Es ist halt so, dass ich Linux benutze. Und: Es ist auf der einen Seite so, dass ich wegen Linux ogg benutze, aber ich muss das auch. Weil: Wie gesagt, das ist nicht nur der VLC-Player selber, sondern es sind die Codecs. Und das ist zum Beispiel ffmpeg. Und was der VLC-Player streamen kann, umwandeln, wiedergeben kann, das hängt von den Codecs ab und vom Betriebssystem. VLC kann in Linux zwar mp4 abspielen, das heißt auf dem Bildschirm anbezeigen. Aber es kann das unter Linux nicht streamen. Es gibt im Netz eine Tabelle, die gibt an, was genau VLC unter welchem Betriebssytem kann.
Auf der anderen Seite, müssen wir komplizierter denken. Das ist bei VLC nicht so, wie bei einem Media-Player. Das heißt wir haben eine Datei oder seit neuestem einen Stream und geben den wieder.
Sondern: VLC hat eine Quelle und ein Ziel. VLC transfomiert quasi. Das ist ein großer Unterschied. Dass zufälligerweise VLC auch ein Interface hat, auf dem sich Videos am Bildschirm ausgeben, soll uns nicht stören. Aber das anders, als die gänge Praxis: Hier eine Datei, hier ein Stream und wir zeigen auf dem Bildschirm.
Das eigentliche Ding ist: Wir haben eine Quelle. Eine Datei, einen Stream, eine Webcam. Und den Transformieren und liefern ihn zu einem anderen Ziel: Das heißt: Canvas - Leinwand, als Fenster, Bildschirm, oder Stream oder Datei. Dabei soll uns nicht stören, dass VLC zufälligerweise noch ein Interface für den Bildschirm hat, auf dem Videos dargestellt werden können.
Und was noch dazu kommt, wir haben ein Format, indem das Video ist. Das heißt, wir heben eben MPEG, MP4, OGG und so weiter. Und wenn wir das transformieren, von einer Quelle zu einem Ziel, dann haben wir ein ein Quellformat. Aber auch das Ziel hat ein Format - der Videooutput, sind am Ende Rohdaten - aber die bleiben nicht alle im Speicher, nur das aktuelle. Und wir können wenn wir die Quelle beliebig angeben können und das Ziel, auch das Quellformat und das Zielformat beliebig angeben. Und das wird das transcodiert.
Und so können wir zum Beispiel das Quellformat MPEG haben und das Zielformat OGG. Wir haben jetzt zwei Dateien: Die Ausgabe und die Eingabe. Und wir können, auch ohne den Bildschirm zu benutzen, das vollziehen. Nämlich die Umwandlung, nämlich mit zwei Dateien.
Wir müssen aber aufpassen: Wenn wir im Netz livestream angucken, zum Beispiel auf Facebook, dann scheint das ja wenig mit einer Datei im MPEG-Format zu tun zu haben. Stimmt aber nicht. Die Livestreams sind jetzt nicht unbedingt in einer Datei - aber sie sind ebenso in einem Format - OGG, MPEG. Was passiert denn, wenn ich mit VLC nicht mit Firefox, so einen stream öffne:
http://www.ituenix.de:8081/webcam.ogg
Ich kann den als Ziel wieder speichern. Weil auch auf "der anderen Seite" gilt für VLC dasselbe Prinzip.
Wenn wir jetzt den Befehl
vlc v4l2:// :input-slave=alsa:// :v4l2-standard=1 :v4l2-dev=/dev/video1 :v4l2-width=1280 :v4l2-height=720 :sout="#transcode{vcodec=theo,vb=1000,acodec=vorb,ab=128,channels=2,samplerate=44100}:http{dst=:8081/webcam.ogg}" -I dummy
Angucken: dann haebn wir da zum Beispiel, die Eingabegeräte. Die erkennt man indem Fall vorallem an v4l2. Da steht v4l2-dev=/dev/video1. Also, ist die Quelle.
Jede Webcam, die wir in Linux anschließen, kriegt durchnummeriert, den Gerätenamen
/dev/video0
/dev/video1
/dev/video2
So. Dann wird noch die Höhe und Breite angegeben. Jetzt steht da #transcode und das ist eben wohin es transformiert wird. Dazu sind zwei Dinge wichtig: vcodec=theo - das ist der Videocodec acodec=vorb. Das ist der Audiocodec. Jetzt brauchen wir ein Ziel. Das ist indem Fall http. Und zwar: Unter dem Port 8081 zum Beispiel und mit dem Namen webcam.ogg.
Wir müssen uns vergewärtigen. Statt http könnten wir auch eine Datei angeben. Und die könnte sogar webcam.ogg heißen.
Wir gehen jetzt mal davon aus, unser Ziel ist Netzwerk und nicht Datei. Das Entscheidende ist: Wir können über die Konsole starten: Weil das Bild soll im Netz zu sehen, auch, wenn es hier genauso ohne Bild, als Datei gespeichert werden kann, mit einem ähnlichen Befehl, wo allerdings die Quelle die Netzwerkressource ist und das Ziel eine Datei ist. Wir müssen uns vergegenwärtigen: Datei und Daten haben nicht automatisch den Zwang am Bildschirm dargestellt werden. Jemand kann meinen Stream im Netzwerk aufzeichnen und es hat ihn nie jemand gesehen.
Auf der anderen Seite: Wir sind jetzt im Netzwerk. Da haben wir einen Port. Wenn wir jetzt im lokalen Netz sind, also im LAN, dann können wir jetzt den Livestream erreichen über:
http://192.168.178.20:8081/webcam.ogg
zum Beispiel. Wobei das erste die IP-Adresse des Rechners ist und zweites der Port. Wir müssen uns aber vorstellen, was VLC hier tut, ist quasi dasselbe, was unser HTTP-Server apache2 zum Beispiel tut. Sie müssen jetzt nicht denken, VLC sei von seinem "HTTP-Interface" so kompliziert wie apache2. Von der Seite von HTTP aus gesehen, als Webserver ist apache2 mehr. Sie müssen HTTP so verstehen: Sie können quasi als Datei eine einzelne Datei zur Verfügung stellen, die im Netz zur Verfügung gestellt wird. Und wir erinnern uns: Trotzt HTTP, ist das ogg und mp4 und was auch immer.
Verstehen Sie: Sie können diese Livestreams über Firefox angucken. Indem Sie, in die Adressleiste eingeben:
http://www.ituenix.de:8081/webcam.ogg
Dann wird das über Firefox angezeigt. Warum geht das. Na ja, wenn bei apache2 jeman in dem
/var/www/html
Ordner eine Date abc.txt hat, kann man die direkt über Firefox aufrufen. Und so kann man in einem HTML-Datei das Video-Tag einfügen.
Man kann geben
<video>
<source src="test.mpeg">
</video>
Und das ist jetzt eine HTML-Datei. Die sollte im Verzeichnis wie test.mpeg. Aber jetzt können sie über Firefox test.mpeg anschauen. Dasselbe gilt aber für Livestreams. Wissen Sie letzten Endes interessiert sich Firefox nicht dafür, ob das Livestream ist oder eine Datei. Jeder Livestream hat genauso ein Format *.mpeg, *.mp4, *.ogg, ... wie die Dateien auch.
Was sie halt brauchen ist eine von außen gut erreichbare statische IPv4-Adresse. Sie können im lokalen Netz, vorrausgesetzt, sie haben keine Firewall irgendwie sehr seltsam da eingebaut, jetzt immer schauen, wenn sie mehr als einen Computer im Netz haben:
http://192.168.178.20:8081/webcam.ogg
Das ist aber nur im lokalen Netz so - sie werden lachen - das kann ich schon lange - das konnte ich schon, als ich noch bei meiner Mutter lebte. Da habe ich das zum ersten Mal im lokalen Netz ausprobiert. Livestream von einem Computer zum anderen.
Das Problem ist, das muss von außen erreichbar sein, wenn sie von überall her aus in ihr Zimmer gucken wollen, oder wollen, dass andere auch gucken können.
Und dafür brauchen Sie eine von außen gut erreichbare statische IPv5-Adresse. Die kriegen sie nur über ihren Internet Service Provider. Also über ihren Anbieter vom Festnetz. Sie müssen bedenken: Sie können jedes Netz auch selber aufbauen. Sie können 4.000.000.000 Computer kaufen und ein Netz aufbauen, was so groß ist wie das Internet - und auch seinen Regeln gehorcht - die Regeln sind TCP/IP. Blos, sie wollen dass man Sie in diesem Netz, im Internet, wo sie wissen, das geht gut nach Amerika, erreicht. Deswegen müssen Sie mit diesem Netz verbunden sein. Und das geht nicht anders, als mit Vodafone, Telecom, O2 und wie sie alle heißen. Weil: Die Kabel sind nicht anders als ihre: Aber die liegen halt unter der Straße und die gehören ihnen nicht. Darüber wacht Vodafone zum Beispiel.
Und die muss statisch sein. Weil Sie haben ja einen Domainnamen. Ich habe zum Beispiel ituenix.de. Und zu dem Domainnamen wird im DNS-System, was weltweit gültig ist, sie können privates DNS aufbauen, mit 4.000.000.000 gekauften Computern, blos, das hat keine weltweite verbindliche Gültigkeit, müssen Sie eine IP-Adresse speichern. Mein Domainname ist irgendwo im DNS gespeichert. Aber der muss auf eine IP-Adresse verweisen. Nur der Domain-Name bringt nichts. Sie brauchen eine IP-Adresse. Wenn die sich immer ändern würde, das DNS weiß nichts, davon, wie sich ihre IP verändert. Und dann kann man sie am nächsten Tag mit dem Domainnamen nicht mehr erreichen.
Und auf der anderen Seite: So betreiben Sie auch ihren Webserver apache2 - wie ich. Der heißt dann nicht VLC, sondern apache2, ist nicht am Port 8081, sondern am Port 80 - und sie können beides machen - apache2 an Port 80 und Webcams an Ports 8081, 8082, 8083, und so weiter. Jeden Port, das heißt jede Zahl zwischen 0 und 64k-1 können sie benutzen. So viele Programme können Sie starten, und so viele Dienste können sie im Internet unter eine IP-Adresse anbieten.