Brauche hilfe um Video anzuzeigen

sorgonas

Grünschnabel
Hallo an alle,

ich habe ein Problem ein Video abzuspielen. Ich habe es auch nicht im DocRoot, damit nicht jeder es so öffnen kann. Ich bekomme zwar die Namen der Videos und auch grösse usw. ausgelesen, jedoch schaffe ich es nicht diese auch in den Player einzubinden, das dieser den dann abspielt.
Die Ordner auf meinem Webspace sehen ca. so aus:

->abfrage [DOCROOT]
->video [Hier sind die Videos]

hier ist meine abfrage.php um einen film auszuwählen, was auch funktioniert, und diese angezeigt bekomme:
PHP:
<?php
// Ordnername
$ordner = "../video/"; //auch komplette Pfade möglich ($ordner = "download/files";)

// Ordner auslesen und Array in Variable speichern
$alledateien = scandir($ordner); // Sortierung A-Z
// Sortierung Z-A mit scandir($ordner, 1)

// Schleife um Array "$alledateien" aus scandir Funktion auszugeben
// Einzeldateien werden dabei in der Variabel $datei abgelegt
?>

            <div align="center" id="auswahl">
<?php
foreach ($alledateien as $datei) {

    // Zusammentragen der Dateiinfo
    $dateiinfo = pathinfo($ordner."/".$datei);
    //Folgende Variablen stehen nach pathinfo zur Verfügung
    // $dateiinfo['filename'] =Dateiname ohne Dateiendung  *erst mit PHP 5.2
    // $dateiinfo['dirname'] = Verzeichnisname
    // $dateiinfo['extension'] = Dateityp -/endung
    // $dateiinfo['basename'] = voller Dateiname mit Dateiendung

    // Größe ermitteln zur Ausgabe
    $size = ceil(filesize($ordner."/".$datei)/1024);
    //1024 = kb | 1048576 = MB | 1073741824 = GB

    // scandir liest alle Dateien im Ordner aus, zusätzlich noch "." , ".." als Ordner
    // Nur echte Dateien anzeigen lassen und keine "Punkt" Ordner
    // _notes ist eine Ergänzung für Dreamweaver Nutzer, denn DW legt zur besseren Synchronisation diese Datei in den Orndern ab
    if ($datei != "." && $datei != ".."  && $datei != "_notes") {
    ?>

    <?php
    echo '<li><a href="player.php">'.$dateiinfo['filename'].'</a> </li>';
    $_SESSION['filmlink'] = $dateiinfo['dirname'].'/'.$dateiinfo['basename'];

    };
};
?>

und dies ist die Player.php welche diesen anzeigen soll, was jedoch nicht geht:
PHP:
<div class="mitte">
            <video id="video" width="584px" height="333px" controls="true">
                <?php echo '<source id="videoWebm" src="'.$_SESSION['filmlink'].'" type="video/webm"></source>'; ?>
            </video>
        </div>

hat von euch jemand eine Idee, wie ich dies hinbekommen kann?
 
Zuletzt bearbeitet:
Hy, ja habe ich. Da wird der link gleich ausgegeben, sprich SRC="../video/film.webm"

Ps.: hab es ja über session weiter gegeben.
 
Zuletzt bearbeitet:
Ich habe es noch nicht ganz nachvollziehen können. Du hast also im DocumentRoot eine Datei liegen, die abfrage.php heißt und den oben gezeigten Code beinhaltet? Oder hast du im DocumentRoot einen Ordner mit dem Namen "abfrage", in dem sich das Script "abfrage.php" befindet?

Nur so ganz nebenbei: Du bist dir im Klaren darüber dass man über http-Zugriff auf deinen Server nur auf Dateien und Ordner zugreifen kann, die im DocumentRoot und darunter liegen?
 
zur ersten Frage: Abfrage ist nen Ordner, welcher der DocumentRoot ist. worin die index.php, abfrage.php und auch die Player.php liegen.
Der Video-Ordner ist parallel gelegen davon. also nicht im DocumentRoot!

zum zweiten ist dies mir klar, weswegen ich dies ja auch so lösen möchte, damit die Videos nicht für jedermann einfach so abgerufen werden können.

Mit dem abfrage.php bekomme ich den Inhalt des video-Ordners ja angezeigt, jedoch kann ich diese nicht im Player.php abspielen wie gewollt, welches hier ja mein Problem ist.
 
Der Video-Ordner ist parallel gelegen davon. also nicht im DocumentRoot!

zum zweiten ist dies mir klar, weswegen ich dies ja auch so lösen möchte, damit die Videos nicht für jedermann einfach so abgerufen werden können.

Und genau deswegen funktioniert es nicht. Der HTML-Code verweist auf eine Datei, die für den Browser nicht erreichbar ist. Nur was unterhalb DocumentRoot liegt, kann auch vom Browser erreicht werden.

Wenn du nicht willst, dass jeder die Videos direkt abrufen kann, musst du ein Script einbauen, dass die Dateien aus dem Ordner ausliest und streamed. Also etwa in der Art: play.php innerhalb des Ordners "abfrage" öffnet das Video, dass mittels GET-Parameter übergeben wird. Beispiel-Source der Player.php:

HTML:
       <div class="mitte">
            <video id="video" width="584px" height="333px" controls="true">
                 <?php echo '<source id="videoWebm" src="play.php?film='.$_SESSION['filmlink'].'" type="video/webm"></source>'; ?>
            </video>
        </div>

Und dann in der play.php:

PHP:
header('Content-Type: video/webm');
$film = $_GET['film'];
echo file_get_contents($film);

Innerhalb des play.php sollten dann noch spezielle Prüfungen stattfinden, also ob der Inhalt von $film nicht evtl. wo anders hinzeigt als in ../video.
 
mhh.. habe es so mal probiert, jedoch geht dies leider auch nicht, auch wenn ich in der play.php den kompleten pfad und film.webm eingebe und dieses Skript nur starte
 
habe gerade die seite angesehen und in die fav gespeichert. werde ich morgen früh mal austesten. gebe hier wieder bescheid, wenn ich weiss obs geklappt hat oder nicht :-) Danke dir
 
versuche es nun schon die letzten tage das irgendwie hin zu bekommen, aber irgendwie funktioniert das nicht. ich weiss nicht, was ich da falsch mache.
unter "Path" auf der seite kommt ja der link rein von der film.webm, aber muss ich auch was unter stream eintragen und wenn was?
kann mir damit jemand weiterhelfen?
hier mal der Code von der seite:

PHP:
<?php
/**
* Description of VideoStream
*
* @author Rana
* @link http://codesamplez.com/programming/php-html5-video-streaming-tutorial
*/
class VideoStream
{
    private $path = "";
    private $stream = "";
    private $buffer = 102400;
    private $start  = -1;
    private $end    = -1;
    private $size   = 0;
    function __construct($filePath)
    {
        $this->path = $filePath;
    }
    
    /**
     * Open stream
     */
    private function open()
    {
        if (!($this->stream = fopen($this->path, 'rb'))) {
            die('Could not open stream for reading');
        }
        
    }
    
    /**
     * Set proper header to serve the video content
     */
    private function setHeader()
    {
        ob_get_clean();
        header("Content-Type: video/mp4");
        header("Cache-Control: max-age=2592000, public");
        header("Expires: ".gmdate('D, d M Y H:i:s', time()+2592000) . ' GMT');
        header("Last-Modified: ".gmdate('D, d M Y H:i:s', @filemtime($this->path)) . ' GMT' );
        $this->start = 0;
        $this->size  = filesize($this->path);
        $this->end   = $this->size - 1;
        header("Accept-Ranges: 0-".$this->end);
        
        if (isset($_SERVER['HTTP_RANGE'])) {
 
            $c_start = $this->start;
            $c_end = $this->end;
            list(, $range) = explode('=', $_SERVER['HTTP_RANGE'], 2);
            if (strpos($range, ',') !== false) {
                header('HTTP/1.1 416 Requested Range Not Satisfiable');
                header("Content-Range: bytes $this->start-$this->end/$this->size");
                exit;
            }
            if ($range == '-') {
                $c_start = $this->size - substr($range, 1);
            }else{
                $range = explode('-', $range);
                $c_start = $range[0];
                
                $c_end = (isset($range[1]) && is_numeric($range[1])) ? $range[1] : $c_end;
            }
            $c_end = ($c_end > $this->end) ? $this->end : $c_end;
            if ($c_start > $c_end || $c_start > $this->size - 1 || $c_end >= $this->size) {
                header('HTTP/1.1 416 Requested Range Not Satisfiable');
                header("Content-Range: bytes $this->start-$this->end/$this->size");
                exit;
            }
            $this->start = $c_start;
            $this->end = $c_end;
            $length = $this->end - $this->start + 1;
            fseek($this->stream, $this->start);
            header('HTTP/1.1 206 Partial Content');
            header("Content-Length: ".$length);
            header("Content-Range: bytes $this->start-$this->end/".$this->size);
        }
        else
        {
            header("Content-Length: ".$this->size);
        } 
        
    }
   
    /**
     * close curretly opened stream
     */
    private function end()
    {
        fclose($this->stream);
        exit;
    }
    
    /**
     * perform the streaming of calculated range
     */
    private function stream()
    {
        $i = $this->start;
        set_time_limit(0);
        while(!feof($this->stream) && $i <= $this->end) {
            $bytesToRead = $this->buffer;
            if(($i+$bytesToRead) > $this->end) {
                $bytesToRead = $this->end - $i + 1;
            }
            $data = fread($this->stream, $bytesToRead);
            echo $data;
            flush();
            $i += $bytesToRead;
        }
    }
    
    /**
     * Start streaming video content
     */
    function start()
    {
        $this->open();
        $this->setHeader();
        $this->stream();
        $this->end();
    }
}
 
Zurück