Lighttpd MP4/h264 Video Streaming mit mod_h264_streaming

2010-03-27 - kostaki 4 Kommentare »

Lighttpd Logo

Video Streaming gehört seit einigen Jahren zum normalen Webseitengeschehen dazu. Ziel dieses Artikels ist es einen Lighttpd Server mit HTTP Pseudo Video Streaming für MP4/H.264 via mod_h264_streaming auf einem Debian Lenny zu installieren. Mit diesem System kann man dann eigene Flash Videos oder MP4 Videos streamen und ist nicht mehr auf Youtube oder andere Plattformen angewiesen. Der H.264 Codec sorgt dabei für hohe Qualität und das benötigte Streaming Modul gibt es für die wichtigsten Webserver (Apache, Lighttpd, Nginx, IIS usw.). Hier gibt es einige Beispiele. Wer es Kommerziell einsetzen möchte, sollte sich die sehr fairen Lizenzbestimmungen ansehen.

Das mod_h264_streaming Modul wird in aktuellen Versionen von Lighttpd nicht mit ausgeliefert, deshalb muss man es selbst kompilieren. Da ich auf Live Systemen gern auf die build Umgebung verzichte, wird das kompilieren auf einem extra Server stattfinden. Im Anschluss kopiert man nur das neue Modul auf den Live Server und binde es ein. Wer dies nicht möchte kann auch alle Schritte auf dem zukünftigen Streamingserver durchführen. Für reines FLV's Streaming reicht das mitgelieferte mod_flv_streaming aus.

Lighttpd mod_h264_streaming kompilieren

Wie schon beschrieben kompiliere ich auf einem Testserver und übertrage das fertige Modul dann später auf den Live Server. Zuerst werden die nötigen build essentials installiert.

$ aptitude install build-essential automake autoconf libtool pkg-config

Als nächstes besorgt man sich wie hier beschrieben den Sourcecode des Lighttpd 1.4.18 in dem mod_h264_streaming enthalten ist, sowie die aktuellen Debian Lenny Source Files des Lighttpd. Dazu muss in der sources.list mindestens eine Source Zeile (deb-src ...) stehen.

$ cd /tmp
$ wget http://h264.code-shop.com/download/lighttpd-1.4.18_mod_h264_streaming-2.2.9.tar.gz
$ tar -zxvf lighttpd-1.4.18_mod_h264_streaming-2.2.9.tar.gz
$ apt-get source lighttpd
dpkg-source: extracting lighttpd in lighttpd-1.4.19
dpkg-source: info: unpacking lighttpd_1.4.19.orig.tar.gz
dpkg-source: info: applying lighttpd_1.4.19-5.diff.gz

Jetzt kopiert man die benötigen Dateien aus dem lighttpd-1.4.18/src Source Ordner in den lighttpd-1.4.19/src Ordner. Das sind die folgenden:

  • mod_h264_streaming.c
  • mod_streaming_export.h
  • moov.*
  • mp4_io.*
  • mp4_process.*
  • mp4_reader.*
  • mp4_writer.*
  • output_bucket.*
  • output_mp4.*
$ cd /tmp/lighttpd-1.4.18/src/
$ cp mod_h264_streaming.c mod_streaming_export.h moov.* mp4_io.* mp4_process.* \
mp4_reader.* mp4_writer.* output_bucket.* output_mp4.* /tmp/lighttpd-1.4.19/src/

Wenn die Dateien im richtigen Ordner sind muss noch die Makefile.am angepasst werden. Nach dem Block beginnend mit lib_LTLIBRARIES += mod_flv_streaming.la diesen Abschnitt einfügen und speichern.

$ cd /tmp/lighttpd-1.4.19/src/
$ nano Makefile.am
lib_LTLIBRARIES += mod_h264_streaming.la
mod_h264_streaming_la_SOURCES = mod_h264_streaming.c \
                                mod_streaming_export.h \
                                moov.c moov.h \
                                mp4_io.c mp4_io.h \
                                mp4_reader.c mp4_reader.h \
                                mp4_writer.c mp4_writer.h \
                                mp4_process.c mp4_process.h \
                                output_bucket.c output_bucket.h \
                                output_mp4.c output_mp4.h
mod_h264_streaming_la_CFLAGS = $(AM_CFLAGS) -DBUILDING_H264_STREAMING
mod_h264_streaming_la_LDFLAGS = -module -export-dynamic -avoid-version -no-undefined
mod_h264_streaming_la_LIBADD = $(common_libadd)

Will man wie ich nur das fertige mod_h264_streaming Modul haben, kann man weitere Abhängigkeiten beim configure abschalten.

$ cd /tmp/lighttpd-1.4.19/
$ ./autogen.sh
$ ./configure --without-pcre --without-zlib --without-bzip2 \
--without-fam --enable-maintainer-mode --prefix=/opt/lighttpd
$ make && make install

Ansonsten müssen noch ein paar Pakete (z.B. libpcre3-dev, zlib1g-dev, libbz2-dev, libfam-dev) installiert werden. ./configure --help sollte dabei weiter helfen. Es ist kein Problem das das Module in der Auflistung nicht auftaucht. Nach dem absenden hat man Lighttpd unter /opt/lighttpd installiert und mod_h264_streaming.so findet man unter /opt/lighttpd/lib/.

mod_h264_streaming aktivieren und konfigurieren

Das Module (/opt/lighttpd/lib/mod_h264_streaming.so) kopiert man nun auf den Live Server (/usr/lib/lighttpd/mod_h264_streaming.so) und setze die richtigen Rechte. Anschließend wird es in der lighttpd.conf aktiviert/konfiguriert und der Lighttpd neu gestartet.

$ cp mod_h264_streaming.so /usr/lib/lighttpd/
$ chown root:root /usr/lib/lighttpd/mod_h264_streaming.so
$ chmod 644 /usr/lib/lighttpd/mod_h264_streaming.so
$ nano /etc/lighttpd/lighttpd.conf && /etc/init.d/lighttpd restart
server.modules = (
  ...,
  "mod_h264_streaming",
  ...
)

# Files ending in .mp4 and .f4v are served by the module
h264-streaming.extensions = ( ".mp4", ".f4v" )

# The number of seconds after which the bandwidth is shaped (defaults to 0=disable)
h264-streaming.buffer-seconds = 10

H.264 Streaming Test (wget)

Wie man den ordnungsmäßigen Betrieb testen kann wird hier beschrieben. Ich fasse es noch einmal kurz in deutsch zusammen.

  1. Man geht in die Document Root des Webservers/Vhost und downloaded sich ein test mp4 File und setzt die richtigen Zugriffsrechte
  2. Nun kann man dieses Testfile per wget oder curl downloaden und dabei die neuen Parameter (start/end) benutzen. Dieser Befehl lädt nur ab Sekunde 45, bis Sekunde 55 herunter. Das ergibt bei mir ein 2,4MB großes File.
$ cd /var/www/ && wget http://h264.code-shop.com:8080/trailer2.mp4
$ chmod 644 trailer2.mp4
$ wget -O test.mp4 "http://eigene-server-adresse/trailer2.mp4?start=45&end=55"

H.264 Streaming Test (jwplayer)

Will man sehen wie es im Browser aussieht, kann man dies mit dem jwplayer machen. Dazu geht man auf die jwplayer Seite zum Setup Wizard. Hier kann man sein File sofort testen. Einfach die folgenden Parameter anpassen und "Update Preview & Code" klicken.

File properties:
file = http://eigene-server-adresse/trailer2.mp4
provider = http
start = 45 (muss nicht sein)

Das Video sollte nun starten und man kann an irgend eine Stelle im Film springen. Es gibt noch andere Player, aber mir gefällt der jwplayer ganz gut. Was er genau alles kann findet man hier.

Erweiterungen

Lighttpd bringt noch 2 weitere Module mit die im Zusammenhang mit mod_h264_streaming interessant sind. Diese sind mod_expire mit dem man Cache Control Header für Dateien definieren kann und mod_secdownload, mit dem man Hotlinking verhindern kann. Die Reihenfolge in der die Module geladen werden ist hier wichtig (mod_secdownload vor mod_h264_streaming)!

server.modules = (
  "mod_expire",
  "mod_secdownload",
  "mod_h264_streaming",
  ...
}

Related Links

  1. 4 Kommentare

  2. Patrick
    schrieb am 07.10.2011 um 14:11 Uhr

    Danke schön für diese Anweisung!
    Ich habe Heute selbst das h264 Modul auf Debian Squeeze compiliert…

  3. chrisz
    schrieb am 17.02.2012 um 13:36 Uhr

    Dankeschön. Heute auf Lenny gemacht, und läuft. Top.

  1. Trackback(s)

  2. Mrz 17, 2011:Debian – Installer le module h264 streaming pour Lighttpd - Armetiz – Thomas Tourlourat – CV Ingénieur Informatique
  3. Nov 5, 2012:Debian – Installer le module h264 streaming pour Lighttpd | Armetiz

Kommentar schreiben

*

*