Streamingdienste im Internet gibt es viele, einige davon hat man vllt. sogar schon mal genutzt – sei es als user oder als broadcaster. Diese Dienste sind praktisch, weil man sich nen Account eben im Web klicken kann, sie meist irgendwelche sozialen Features haben und vllt. sogar Aufzeichnungen der Übertragungen erstellen können. Sehr viel mehr Flexibilität ist aber nicht zu erwarten.

Mehr Freiheiten hat man aber definitiv mit seinem eigenen Streaming Server – nicht zuletzt weil es so kaum Beschränkungen gibt, was man übertragen darf (von rechtlich fragwürdigen Inhalten mal abgesehen).

Dieser Streaming Server ist mit nginx, einer freien Webserver Software und einem optionalen Modul recht einfach aufzusetzen, dafür benötigt man logischerweise erstmal einen Server, wobei es zumindest für erste Tests relativ egal ist, wie stark er ist, das kann ein Rootserver, ein kleiner V-Server oder gar ein Raspberry Pi sein.

Hierzu installieren wir (auf einem Debian System) erstmal zum Kompilieren die nötigen Abhängigkeiten: (alle Schritte als user root)

$ aptitude install build-essential libpcre3 libpcre3-dev libssl-dev git-core

Dann den aktuellen Mainline Version des nginx Quellcodes:

$ cd /usr/local/src/
$ wget http://nginx.org/download/nginx-1.5.12.tar.gz

Und den aktuellen Snapshot des rtmp-Moduls:

$ git clone https://github.com/arut/nginx-rtmp-module.git

Nun alles entpacken und in das Verzeichnis wechseln:

$ tar xfvz nginx-1.5.12.tar.gz
$ cd nginx-1.5.12

Wir konfigurieren den Quellcode so, dass das rtmp Modul gleich mit reinkompiliert wird:

$ ./configure --with-http_ssl_module --add-module=../nginx-rtmp-module
$ make
$ make install

Jetzt ist der nginx unter /usr/local/nginx/ intalliert und kann konfiguriert werden. Hierzu reicht für erste einfache (lokale) Tests schon eine simple application wie im Beispiel live zu sehen, möchte man etwas mehr „security-by-obscurity“, kann man eine weitere app anlegen, die mit hidden path „geschützt“ Streams annimmt und auf die live app pusht – bei Bedarf sogar mit Rekodierung oder Aufzeichnung:

# keep $PATH
env PATH; #needed to be able to call program names without full path
rtmp {
 server {
  listen [::]:1935 ipv6only=off; # needed to listen to IPv4 *and* IPv6
  chunk_size 4096;
 application hyper-secret-hidden-app-name {
  live on; # one-to-many streaming
  meta copy;
  push rtmp://localhost/live/; # push stream to app "live"
 # push rtmp://live−fra.twitch.tv/app/;
 # exec avconv −i rtmp://localhost/secret_input_1395149336/$name −c copy −f flv rtmp://localhost/live/$name;
  allow publish 192.168.122.0/24;
  allow publish 192.168.126.0/24;
  allow publish 212.124.40.2;
  deny publish all;
  allow play 127.0.0.1;
  deny play all;
 record all;
  record_path /tmp/rec;
  record_unique on;
  record_interval 60s; 
  exec_record_done avconv −i $path −c copy /var/www/cloud.commander1024.de/docs/streamdumps/$basename.mp4;
  }
 application live {
  live on;
  record off;
  allow publish 127.0.0.1;
  deny publish all;
  allow play all;
  }
 }
}

Dieser Stream kann nun mit ffmpeg, avconv, praktischen Skriptsammlungen wie der von wargio oder gängigen grafischen Programmen wie der Open Broadcaster Software (OBS), Xsplit bespielt werden.

Zum Abspielen bietet sich jeder halbwegs gescheite Mediaplayer von vlc über (s)mplayer an, sowie diverse (Flash)-basierte Player zum Einbetten in Webseiten. Als Beispiele seinen das der Flowplayer oder der JW Player genannt. Will man den Stream ohne Flash abspielen oder auch auf iOS Geräten, muss man den Stream wieder mit avconv umverpacken in das .mp4 Containerformat und lässt sich so ebenfalls mit dem rtmp Modul streamen, hier deswegen noch ein Hinweis auf die Doku des Moduls.