Gestern wurde der Flowplayer schon kurz vorgestellt und berichtet, dass mit ihm auch das Streaming von Videos möglich ist. In diesem Artikel wird genauer darauf eingegangen, wie mit einem einfachen Webserver mit PHP Unterstützung und einem kleinen PHP Skript das Streaming auf eine sehr leichte Art und Weise realisiert werden kann.
Vorbereitung
Bevor das eigentliche Streaming beginnen kann sind ein paar Vorbereitungen zu treffen. So ist es in diesem Beispiel wichtig, dass das Video als Flash-Video (FLV-Datei) vorliegt. Weiterhin ist es von großer Bedeutung, dass das Video mit sogenannten Key-Frames erstellt wurde. Dies kann zum Beispiel bei dem Tool ffmpeg mit der Option -g realisiert werden. Was dann wie folgt aussehen könnte.
$ ffmpeg -i -g 30 ausgabe.flv
Die Ausgabe beinhaltet zwar jetzt Key-Frames, jedoch muss eine Liste dieser am Anfang der Datei abgelegt sein, damit ein Suchen im Video während dem Ladevorgang schon möglich wird. Dazu kann folgender Befehl verwendet werden.
$ flvtool2 -U .flv
Jetzt ist die Datei für das Streaming vorbereitet.
PHP-Skript
Für das Streaming ist es wichtig, dass auf der Seite ein Skript das Video ab der Position ausliefert, ab der es der Benutzer auch haben möchte. Dazu gibt es verschiedenste Möglichkeiten. Einige von ihnen setzen aber einen direkten Zugriff auf den Webserver voraus und können als Erweiterung installiert werden. Steht jedoch kein direkter Zugriff auf den Webserver zur Verfügung, so kann das Streaming auch mit einem kleinen PHP-Skript realisiert werden. Folgendes Skript kann als zum Beispiel stream.php auf dem Webserver gespeichert werden. Anschließend muss nur noch der Pfad bei FILE_PATH angepasst werden.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
// Pfad in dem die .flv Dateien liegen
define('FILE_PATH', '/var/www/');
// ab hier nichts ändern
$filename = '';
$start = 0;
// Dateiname ermitteln
if(isset($_GET['file'])) {
$filename = $_GET['file'];
} else if(isset($_SERVER['PATH_INFO'])) {
$filename = $_SERVER['PATH_INFO'];
}
// Startpunkt ermitteln
if(isset($_GET['start'])) {
$start = $_GET['start'];
}
// Dateiname vorbereiten und pruefen
$filename = htmlspecialchars(ltrim($filename,'/'));
// stop wenn datei nicht auf .flv endet
if(strtolower(strrchr($filename, '.')) != '.flv') {
header("HTTP/1.0 404 Not Found");
exit();
}
// stop wenn es .. im Dateiname gibt
if(preg_match("/\.\./", $filename)) {
header("HTTP/1.0 404 Not Found");
exit();
}
// gibt es die datei
$file = FILE_PATH . $filename;
if(!file_exists($file)) {
header("HTTP/1.0 404 Not Found");
exit();
}
// oeffnen
$fp = @fopen($file, 'rb');
if($fp === False) {
header("HTTP/1.0 404 Not Found");
exit();
}
// Laenge der auszugebenden Datei ermitteln
$filesize = filesize($file) - (($start > 0) ? $start + 1 : 0);
// HTTP-Header ausgeben
header("Content-Type: video/x-flv");
header("Content-Disposition: attachment; filename=\"" . $filename . "\"");
header("Content-Length: " . $filesize);
// Datei-Header, wenn start nicht 0
if($start != 0) {
print('FLV');
print(pack('C', 1));
print(pack('C', 1));
print(pack('N', 9));
print(pack('N', 9));
}
// gib ab Position start die Datei aus
fseek($fp, $start);
while(!feof($fp))
print(fread($fp, 8192));
?>
Flowplayer für Streaming einrichten
Nachdem das Video und das PHP-Skript Vorbereitet wurden, kann der Flowplayer konfiguriert werden. Dazu wird erst einmal das pseudostreaming Plugin benötigt. Dieses muss mit auf dem Webserver abgelegt werden. Anschließend müssen noch ein paar kleine Veränderungen an der Konfiguration des Flowplayer vorgenommen werden. Dies sollte dann ungefähr wie folgt aussehen.
flowplayer("player",
"flowplayer-3.1.3.swf",
{
streamingServer: 'pseudo',
clip : {
autoPlay: false,
autoBuffering: false,
provider: 'pseudo',
},
playlist: [
// stream.php ist die oben angelegte Datei
'stream.php/datei.flv',
],
plugins: {
// pseudo Streaming Plugin laden
pseudo: {
url: 'flowplayer.pseudostreaming-3.1.3.swf',
}
}
}
);
Und schon sollte es Funktionieren, dass während das Video noch geladen wird an Stellen gesprungen werden kann, die noch nicht geladen sind und der Player an dieser Stelle mit dem Abspielen fortfährt.
Links
- Flowplayer (englisch)
- Flowplayer: pseudeostreaming Plugin (englisch)
- ffmpeg.org (englisch)
- RubyForge: FLVTool2 (englisch)