Flowplayer - Streaming leicht gemacht.

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.

Verwandte Artikel