Aufbauen Deiner eigenen Video Community mit Lighttpd und FlowPlayer (Debian Etch)

Version 1.0
Author: Falko Timme


Diese Anleitung veranschaulicht, wie man seine eigene Video Community unter Verwendung von lighttpd mit seinem mod_flv_streaming Modul (zum streaming von .flv Videos, dem Format, das von den meisten großen Video Communities wie YouTube verwendet wird) und seinem mod_secdownload Modul (um zu verhindern, dass die Videos direkt verlinkt werden) aufbauen kann. Ich werden FlowPlayer als Video Player verwenden, ein kostenloser Flash Video Player mit Unterstützung für lighttpds mod_flv_streaming Modul. Außerdem werde ich aufzeigen, wie man Videos (.mp4 .mov .mpg .3gp .mpeg .wmv .avi) als FLV Format verschlüsseln kann, das von Adobe Flash unterstützt wird.

Diese Anleitung ist ohne jegliche Gewähr! Ich möchte an dieser Stelle darauf hinweisen, dass dies nicht der einzige Weg ist ein solches System einzurichten. Es gibt viele Möglichkeiten um das Ziel zu erreichen - dies ist der Weg den ich gewählt habe. Ich übernehme keine Garantie, dass dies auch bei Dir funktioniert!

1 Vorbemerkung

In dieser Anleitung verwende ich ich den Hostnamen server1.example.com mit der IP Adresse 192.168.0.100. Diese Einstellungen können von Deinen abweichen, Du musst sie also an entsprechender Stelle ersetzen.

Wir benötigen eine lighttpd Installation mit PHP Unterstützung, wie in dieser Anleitung beschrieben wird: Installing Lighttpd With PHP5 And MySQL Support On Debian Etch. Ich werde das in dieser Anleitung nicht abhandeln. Wenn Du lighttpd mit PHP Unterstützung noch nicht eingerichtet hast, dann verfahre bitte nach dieser Anleitung.

2 Installation von LAME

LAME ist ein MPEG Audio Layer III (MP3) Verschlüsseler. Wir benötigen dies damit unsere Videos nicht ihren Klang verlieren, wenn sie in FLV konvertiert werden. Leider ist LAME nicht als offizielles Debian Etch Paket verfügbar, also müssen wir es manuell erstellen. Zunächst installieren wir die Tools, die wir für die Erstellung benötigen:

apt-get install build-essential

Dann gehen wir zum /tmp Verzeichnis und laden die neuste LAME Version von SourceForge, z.B. wie folgt:

cd /tmp
wget http://mesh.dl.sourceforge.net/sourceforge/lame/lame-3.97.tar.gz

Dann entpacken und kompilieren wir LAME:

tar xvfz lame-3.97.tar.gz
cd lame-3.97
./configure --enable-shared --prefix=/usr
make
make install

3 Installation von ffmpeg

Wir werden ffmpeg verwenden um unsere Video-Dateien in das FLV Format zu konvertieren. Zuerst installieren wir ffmpeg und ein paar plugins wie folgt:

apt-get install ffmpeg libavcodec0d libavformat0d libavifile-0.7c2 libpostproc0d libasound2-plugins avifile-player avifile-utils avifile-mad-plugin avifile-mjpeg-plugin avifile-vorbis-plugin

Das Problem bei Debians ffmpeg Paket ist, dass es keine Unterstützung für MP3 Verschlüsselung hat, was bedeutet, dass unsere FLV Videos ihren Klang nach der Konvertierung verlieren werden. Daher werden wir Debians ffmpeg Source Paket mit mp3lame Unterstützung (deswegen mussten wir im vorigen Kapitel LAME installieren) neu kompilieren.

Zunächst laden wir das ffmpeg Source Paket nach /usr/src:

cd /usr/src/
apt-get source ffmpeg

Dann wechseln wir zum ffmpeg Source Verzeichnis:

cd ffmpeg-0.cvs20060823

und bearbeiten die Datei debian/rules. Ziemlich am Anfang der Datei siehst Du zwei confflags Zeilen. Füge den Parameter --enable-mp3lame zu einer der Zeilen hinzu und speichere die Datei:

vi debian/rules


[...]
confflags += --enable-gpl --enable-pp --enable-pthreads --enable-mp3lame confflags += --enable-vorbis --enable-libogg --enable-a52 --enable-dts --enable-libgsm [...]
Nun können wir unser neues ffmpeg Paket erstellen:

dpkg-buildpackage

dpkg-buildpackage wird sich höchstwahrscheinlich über fehlende Pakete beschweren, die benötigt werden, um das neue ffmpeg .deb Paket zu erstellen:


server1:/usr/src/ffmpeg-0.cvs20060823# dpkg-buildpackage
dpkg-buildpackage: source package is ffmpeg
dpkg-buildpackage: source version is 0.cvs20060823-8
dpkg-buildpackage: source changed by Sam Hocevar (Debian packages) <sam+deb@zoy.org>
dpkg-buildpackage: host architecture i386
dpkg-buildpackage: source version without epoch 0.cvs20060823-8
dpkg-checkbuilddeps: Unmet build dependencies: debhelper (>= 4.0) quilt libogg-dev libvorbis-dev liba52-dev libdts-dev zlib1g-dev libsdl1.2-dev libfreetype6-dev libimlib2-dev texi2html libraw1394-dev libdc1394-13-dev libtheora-dev (>> 0.0.0.alpha4) libgsm1-dev
dpkg-buildpackage: Build dependencies/conflicts unsatisfied; aborting.
dpkg-buildpackage: (Use -d flag to override.)
server1:/usr/src/ffmpeg-0.cvs20060823#

Falls Du eine Fehlermeldung wie die folgende erhältst, installiere die fehlenden Pakete, z.B. wie folgt:

apt-get install debhelper quilt libogg-dev libvorbis-dev liba52-dev libdts-dev zlib1g-dev libsdl1.2-dev libfreetype6-dev libimlib2-dev texi2html libraw1394-dev libdc1394-13-dev libtheora-dev libgsm1-dev

Führen danach dpkg-buildpackage erneut aus:

dpkg-buildpackage

Der dpkg-buildpackage Befehl sollte ffmpeg nun erneut kompilieren und neue .deb Pakete (ffmpeg plus einige plugins) im /usr/src Verzeichnis erstellen. Das kann etwas dauern, gedulde Dich also etwas. Es kann sein, dass Du einige Warnungen über Signaturen am Ende erhältst - Du kannst sie ignorieren.

Danach gehen wir zum /usr/src Verzeichnis und installieren unsere neuen .deb Pakete:

cd ..
dpkg -i *.deb

Das war's mit ffmpeg.

4 Installation von flvtool2

Wenn wir Videos in das FLV Format konvertieren, müssen wir einige Metadaten wie zum Beispiel die Laufzeit des Videos der FLV Datei hinzufügen, damit FlowPlayer die Spieldauer des Videos richtig anzeigen kann. Wir können diese Metadaten mit flvtool2 hinzufügen. flvtool2 ist in Ruby geschrieben, also müssen wir zunächst Ruby installieren:

apt-get install ruby

Dann laden wir die neuste Version von flvtool2 ins /tmp Verzeichnis, z.B. wie folgt:

cd /tmp
wget http://rubyforge.org/frs/download.php/17497/flvtool2-1.0.6.tgz

Danach installieren wir es:

tar xvfz flvtool2-1.0.6.tgz
cd flvtool2-1.0.6
ruby setup.rb config
ruby setup.rb setup
ruby setup.rb install

5 Video Verzeichnisse erstellen

In dieser Anleitung gehe ich davon aus, dass Dein lighttpd Dokumenten-Root für Deine Video Webseite /var/www (der Standard Dokumenten-Root für lighttpd auf Debian) ist. Natürlich wollen wir die originalen Videos und FLV Videos im Dokumenten-Root ablegen (oder einem Unterverzeichnis), um zu verhindern, dass niemand sie direkt runter laden kann (wenn derjenige den Link kennt). Daher erstellen wir ein Verzeichnis für die originalen Videos (z.B. /var/videos/incoming) und ein Verzeichnis für die FLV Videos (z.B. /var/videos/flv) außerhalb des Dokumenten-Roots:

mkdir -p /var/videos/incoming
mkdir -p /var/videos/flv

Du (oder Deiner Benutzer) kannst dann Deine originalen Videos nach /var/videos/incoming laden (z.B. durch FTP oder einem Web Interface, das Du programmiert) und Du kannst die Videos dann in FLV verschlüsseln (entweder manuell oder mit Hilfe eines Skripts), was im nächsten Kapitel gezeigt wird.

6 Videos in FLV verschlüsseln

Lass uns annehmen wir haben ein Video mit der Bezeichnung video.avi in /var/videos/incoming (funktioniert auch mit den Erweiterungen .mp4 .mov .mpg .3gp .mpeg .wmv). Wir möchten es in die Datei video.flv konvertieren und im Verzeichnis /var/videos/flv ablegen. video.flv soll eine Größe von 320x240 Pixel haben, mit einer Aufzeichnungsrate von 44100 Hz und einer Frame Rate von 12 fps. Und so führen wir es aus:

ffmpeg -i /var/videos/incoming/video.avi -s 320x240 -ar 44100 -r 12 /var/videos/flv/video.flv

(Sieh dir Folgendes an wenn Du Dich über weitere Optionen informieren möchtest

man ffmpeg

)

Das kann etwas dauern. Die Ausgabe sollte so ähnlich wie diese aussehen:

server1:~# ffmpeg -i /var/videos/incoming/video.avi -s 320x240 -ar 44100 -r 12 /var/videos/flv/video.flv
FFmpeg version SVN-rUNKNOWN, Copyright (c) 2000-2004 Fabrice Bellard
configuration: --enable-gpl --enable-pp --enable-pthreads --enable-mp3lame --enable-vorbis --enable-libogg --enable-a52 --enable-dts --enable-libgsm --enable-dc1394 --disable-debug --enable-shared --prefix=/usr
libavutil version: 0d.49.0.0
libavcodec version: 0d.51.11.0
libavformat version: 0d.50.5.0
built on Aug 14 2007 15:02:25, gcc: 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
Input #0, avi, from '/var/videos/incoming/video.avi':
Duration: 00:10:53.8, start: 0.000000, bitrate: 5455 kb/s
Stream #0.0: Video: mpeg4, yuv420p, 1024x576, 24.00 fps(r)
Stream #0.1: Audio: ac3, 48000 Hz, 5:1, 448 kb/s
Output #0, flv, to '/var/videos/flv/video.flv':
Stream #0.0: Video: flv, yuv420p, 320x240, q=2-31, 200 kb/s, 12.00 fps(c)
Stream #0.1: Audio: mp3, 44100 Hz, stereo, 64 kb/s
Stream mapping:
Stream #0.0 -> #0.0
Stream #0.1 -> #0.1
No accelerated IMDCT transform found
Press [q] to stop encoding
frame= 7847 q=2.0 Lsize= 21682kB time=653.8 bitrate= 271.7kbits/s
video:16061kB audio:5108kB global headers:0kB muxing overhead 2.427536%
server1:~#

Bitte achte darauf, dass im Output Bereich zwei Streams angezeigt werden, einen für Video und einen für Audio. Falls Du nur Video siehst, bedeutet das, dass der Klang verloren geht, d.h. Du hast wahrscheinlich in Kapitel zwei und drei etwas falsch gemacht.

Nach der Konvertierung können wir video.flv nun Metadaten mit flvtool2 hinzufügen:

cat /var/videos/flv/video.flv | flvtool2 -U stdin /var/videos/flv/video.flv


7 Konfiguration von Lighttpd

Nun müssen wir lighttpds Hauptkonfigurationsdatei /etc/lighttpd/lighttpd.conf öffnen und darin die Module mod_secdownload und mod_flv_streaming aktivieren. Es ist sehr wichtig, dass mod_secdownload in der server.modules Zeile vor mod_flv_streaming aufgelistet ist. Als ich es andersrum versuchte, stellte ich fest, dass das Vorspulen im FlowPlayer nicht funktionierte!

vi /etc/lighttpd/lighttpd.conf


[...]
server.modules = ( "mod_access", "mod_alias", "mod_accesslog", "mod_fastcgi", # "mod_rewrite", # "mod_redirect", # "mod_status", # "mod_evhost", # "mod_compress", # "mod_usertrack", # "mod_rrdtool", # "mod_webdav", # "mod_expire", "mod_secdownload", "mod_flv_streaming", # "mod_evasive" ) [...]
In der gleichen Datei fügen wir ebenfalls folgende Konfiguration hinzu (Du kannst sie direkt am Ende von /etc/lighttpd/lighttpd.conf anfügen):
[...]
flv-streaming.extensions = ( ".flv" ) secdownload.secret = "somesecret" secdownload.document-root = "/var/videos/flv/" secdownload.uri-prefix = "/dl/" secdownload.timeout = 120
Bitte ersetze somesecret mit Deiner eigenen geheimen Zeichenfolge (Du kannst eine auswählen).

Was mod_secdownload bewirkt ist Folgendes: ein Webprogramm (z.B. ein PHP Skript) kann darin einen Link haben, der so aussehen könnte:

<uri-prefix>/<token>/<timestamp-in-hex>/<rel-path>

z.B.

/dl/d8a8cb150f7e5962f6a8443b0b6c6cc2/46c1d9f6/video.flv

wobei <token> ein MD5 ist von
  1. a secret string (user supplied)
  2. <rel-path> (starts with /)
  3. <timestamp-in-hex>
mod_secdownload wird dann den Link auf die entsprechende Datei im secdownload.document-root (welcher außerhalb des Dokumenten-Roots der Webseite ist) verweisen lassen und Zugriff auf diese Datei für secdownload.timeout Sekunden gewähren. Nach secdownload.timeout Sekunden ist der Link nicht mehr gültig und der Zugriff verweigert.

Nachdem wir FlowPlayer installiert haben, werden wir ein PHP Skript verwenden um die entsprechenden Video Links für mod_secdownload zu generieren.

Hier findest Du mehr Informationen zu mod_secdownload: http://trac.lighttpd.net/trac/wiki/Docs%3AModSecDownload
Vergiss nicht lighttpd nach Deinen vollzogenen Änderungen von /etc/lighttpd/lighttpd.conf neu zu starten:

/etc/init.d/lighttpd restart


8 Installation FlowPlayer

Gehe zu http://flowplayer.org/download und lade die neuste FlowPlayer Version in Dein /tmp Verzeichnis, z.B. wie folgt:

cd /tmp
wget http://belnet.dl.sourceforge.net/sourceforge/flowplayer/flowplayer-1.19.zip

FlowPlayer hat ein .zip Format, also müssen wir unzip installieren um es entpacken zu können:

apt-get install unzip

Danach können wir es entpacken:

unzip flowplayer-1.19.zip

Somit wird ein Verzeichnis namens flowplayer im /tmp Verzeichnis erstellt. Ich möchte dieses Verzeichnis im Dokumenten-Root meiner Video Webseite haben (/var/www), also verschiebe ich es dorthin:

mv flowplayer /var/www/


9 Konfiguration von FlowPlayer

FlowPlayer ist nun installiert. Wir müssen nur noch eine HTML Datei erstellen, mit der wir unser Video ansehen können. Dafür werde ich eine PHP Datei namens /var/www/flowplayertest.php erstellen, die alle Parameter enthält, um FlowPlayer im Browser des Benutzers zu starten und die außerdem gültige Video Links für mod_secdownload erstellt:

vi /var/www/flowplayertest.php


<?php
$secret = "somesecret"; $uri_prefix = "/dl/"; # filename $f = "/video.flv"; # current timestamp $t = time(); $t_hex = sprintf("%08x", $t); $m = md5($secret.$f.$t_hex); ?> <html> <head> <title>Flowplayer Test</title> </head> <body text="#000000" bgcolor="#FFFFFF" link="#FF0000" alink="#FF0000" vlink="#FF0000"> <object type="application/x-shockwave-flash" data="/flowplayer/FlowPlayerThermo.swf" width="320" height="256" id="FlowPlayer"> <param name="allowScriptAccess" value="sameDomain" /> <param name="movie" value="/flowplayer/FlowPlayerThermo.swf" /> <param name="quality" value="high" /> <param name="scale" value="noScale" /> <param name="allowFullScreen" value="true" /> <param name="flashvars" value="config={videoFile: '<?php printf('%s%s/%s%s', $uri_prefix, $m, $t_hex, $f, $f); ?>', streamingServer: 'lighttpd', loop: 'false', useNativeFullScreen: true}" /> </object> </body> </html>
Es ist sehr wichtig, dass $secret den gleichen Wert wie secdownload.secret in /etc/lighttpd/lighttpd.conf hat. $uri_prefix und secdownload.uri-prefix müssen ebenfalls übereinstimmen. Wenn dies erfüllt ist, wird das obige Skript valide Links generieren. $f muss den Dateinamen des FLV Video enthalten, mit einem Slash (/) am Anfang. (Der Dateiname ist im obigen Beispiel hart-kodiert, aber natürlich kannst Du programmieren was immer Du willst um den Dateinamen zu generieren.)

Die <object></object> Zeile enthält die FlowPlayer Konfiguration. FlowPlayer hat verschiedene Designs (siehe http://flowplayer.org/documentation/quick+start); mir gefällt das FlowPlayerThermo Design am besten, also verwende ich das. Unser FLV Video hat eine Größe von 320x240px (siehe Kapitel sechs) und die Kontrollleiste des FlowPlayerThermo Designs hat eine Höhe von 16px. Daher definiere ich eine Weite von 320px und eine Höhe von (240 + 16 = 256)px. Wenn Du ein anderes Design verwendest, dann passe die Höhe entsprechend an.

In der <param name="flashvars"... Zeile können wir das Verhalten von FlowPlayer konfigurieren. Die wichtigste Einstellung ist die videoFile Einstellung (die von PHP im obigen Skript eingestellt wird), die den Pfad zum FLV Video definiert.

Eine weitere wichtige Einstellung ist streamingServer: 'lighttpd' was dazu führt, dass das Video durch lighttpds mod_flv_streaming Modul, das bessere Unterstützung für lange Videos hat, gestreamed wird.

Die anderen beiden Einstellungen (loop, useNativeFullScreen) sind in diesem Setup optional. Wenn Du jedoch useNativeFullScreen auf true setzt (fügt Unterstützung für native Flash 9 full screen mode hinzu), musst Du auch folgende Zeile

<param name="allowFullScreen" value="true" />

in die <object></object> Zeile einfügen und kannst dann nicht

<param name="wmode" value="transparent" />

verwenden.

Um mehr über alle Optionen zu erfahren, die Du in der <param name="flashvars"... Zeile verwenden kannst, sieh Dir http://flowplayer.org/config/variables an.

Jetzt wird es Zeit unsere Einstellungen zu testen. Richte Deinen Browser auf http://192.168.0.100/flowplayertest.php oder http://server1.example.com/flowplayertest.php und Dein Video sollte im Browser gestartet werden (mit Sound):


So sieht der Flash 9 Full Screen Modus aus:

10 Links