Viedeo-Server
Videoserver selbst gemacht
Die Tage habe ich überlegt wie ich am schönsten Flash Videos auf meine Seite bekomme. Auf der Arbeit gab es hierzu einmal ein Serverprojekt, welches jedem Benutzer erlaubt, per FTP Videodateien hochzuladen. Egal welches Format hier hochgeladen wird, bevor das File veröffentlicht wird durchläuft es einen Encoder, der, egal was vorne rein kommt, hinten ein Video im FLV-Container (Flash) ausgibt. In Anlehnung an dieses Projekt habe ich etwas ähnliches bei mir auf der Linux-Shell eingerichtet. Ein Script überwacht einen Incoming-Ordner, über »Crontab« wird dieser Ordner alle 2 Minuten abgefragt. Wird nun ein neues File hochgeladen, startet dieses Script den »mencoder«, legt ein .flv-File im Flash-Ordner an und verschiebt das original File nach erfolgreichem Encoden in einen Archivordner.
Hier der Quellcode (vid2flv.sh)
-
#!/bin/bash
-
-
SOURCE_DIR=/var/www/.../fileadmin/upload-directory
-
DEST_DIR=/var/www/.../fileadmin/flash-directory
-
ARCHIVE_DIR=/var/www/.../fileadmin/upload-directory/.archive
-
-
cd $SOURCE_DIR
-
-
#check whether mencoder is running, if so exit
-
if ps ax |grep -v grep |grep mencoder >/dev/null
-
then
-
echo "mencoder already running, skipping..."
-
exit 1
-
fi
-
-
#running mencoder for each file in SOURCE_DIR
-
for i in `ls -1`
-
do
-
-
#if file ist not in use or uploading, continue...
-
if ! fuser -s $i; then
-
-
#removing file-extension
-
echo "output file: $DEST_DIR/$PREFIX-$FILE_NAME.flv"
-
-
#encode vid
-
mencoder "$i" -o "$DEST_DIR/$PREFIX-$FILE_NAME.flv" -of lavf -ovc lavc -oac mp3lame -lavcopts vcodec=flv:vbitrate=832:autoaspect:mbd=2:mv0:trell:v4mv:cbp:last_pred=3: predia=2:dia=2:precmp=2:cmp=2:subcmp=2:preme=2:turbo:acodec=mp3:abitrate=64 -vf scale=720:400 -srate 22050 -af lavcresample=22050 -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames
-
RETURN=$?
-
-
echo "encoding done with errorlevel $RETURN"
-
-
#moving source to archive dir
-
mv $i $ARCHIVE_DIR
-
fi
-
-
done
/etc/crontab
mencoder installieren
Um das Script zu nutzen wird lediglich der »mencoder« benötigt. Unter Ubuntu z.B. ist er meine ich ganz einfach über »apt-get install mencoder« installierbar. Auf meinem Server läuft Debian etch, hier muss vorher noch folgende Quelle unter /etc/apt/sources.list hinzugefügt werden
-
deb http://debian.netcologne.de/debian-multimedia.org stable main
-
deb-src http://debian.netcologne.de/debian-multimedia.org stable main
Um den Keyring für diese Quellen zu bekommen könnt ihr folgenden Datei herunterladen und über
-
dpkg -i debian-multimedia-keyring_2008.10.16_all.deb
installieren. Der mencoder und die gängigen Video-Codecs werden wie folgt installiert:
-
apt-get update
-
apt-get install mencoder w32codecs
Auflösung, Bitrate, etc...
Eine wichtige Frage, welche Auflösung und welche Bitrate sollen die Videos auf der Seite haben. Hier habe ich auch lange überlegt und bin mir noch immer nicht sicher, ob ich die optimale Konfiguration gefunden habe. Für mich ist klar, es soll eine 16:9-Auflösung sein. Sie sieht zum einen moderner aus, zum anderen besitze ich einen HD-Camcorder und nehme natürlich auch nur in 16:9 auf. Wieviel Qualität man nun zugunsten der Bandbreite und den möglicherweise anfallenden Volumenkosten her gibt, muss jeder für sich entscheiden. Ich habe mich für eine Auflösung von 720x400 bei einer Video-Bitrate von 832kbit entschieden. Audio wird auf eine Samplerate von 22050 mit einer Bitrate von 64kbit heruntergerechnet. Zum Verständnis und Vergleich bitte noch einmal oben im Script den »mencoder«-Aufruf ansehen (»vbitrate«, »abitrate« und »scale«. »srate« einfach bei Änderungen von 22050 auf z.B. 44100 mit »lavcresample« gleichsetzen).
Die Auflösung könnte bei der doch recht niedrigen Bitrate noch ein bisschen kleiner ausfallen, werde ich allerdings kleiner, so bekommt der von mir gewählte FLV-Player Darstellungsprobleme im Vollbild. Hier wird das Bild also einfach wieder vom Player herunterskaliert, solange dieser sich nicht im Vollbild-Modus befindet.
Im Großen und Ganzen lande ich bei der von mir gewählten Konfiguration bei einer Übertragungsrate von ca. 896kbit (das entspricht 112kb/s) und sollte so ab einem DSL1000-Anschluss gut abspielbar sein. Ein Video mit der Länge von 1:33Min ist hier ca 10,5MB groß.
Integration in die Website
So nun habt ihr also einen Ordner auf der Website, in dem die ganzen FLV-Dateien landen. Einfach drauf auf die Website und den Anwender noch kurz auffordern, seinem Browser Flash-Unterstützung zu spendieren, reicht leider nicht ganz aus. Gut in Zeiten von Youtube und co. ist das mit dem Flash natürlich nicht mehr das Problem. Für das Abspielen eines im FLV-Container verschachtelten Filmes wird allerdings noch ein, ich sage mal, Steuer-Container benötigt. Diese zumeist in Flash und Java programmierte Schnittstelle zaubert u.a. den Fortschrittbalken und die Steuertasten unter die Filme. Meine Wahl fiel hier unter Typo3 auf die Extension namens bddb_flvvideogallery. Zum Einsatz kommt in dieser Extension der FLV-Player von Jeroen Wijering. Ich muss aber gestehen, nicht alle durchprobiert zu haben und lasse mir hier gerne Alternativen empfehlen.
Da es sicher im allgemeinen Interesse ist, hier ein Testvideo. Nehmt euch 1:30Min Zeit und lauscht dem Klang der Kaffeemaschine :-)
Update 4.2.2009:
Anscheinend gibt es doch noch Probleme zwischen den »MooTools« und dem »SFWObject«, das Video ist daher erst einmal von der Seite genommen.
