Ich habe Probleme mit dem Streaming .mp4 Videos von PHP zu einem HTML5 Video Tag. Das Video streamt gut und bewegt sich auch vorwärts und rückwärts. ABER: Wenn ich auf einen Link in meinem Menü klicke, ändert sich die Site nicht. Das Ladesymbol erscheint auf der Registerkarte und die Entwicklungstools zeigen an, dass eine Anfrage vorliegt. Aber die Anfrage "wartet" bis zum Ende des Video-Streams. Wenn das Video beendet wurde, wird die neue Seite geladen, aber nicht vorher.PHP Stream zu html5 Video, Seite Navigation funktioniert nicht
Irgendwelche Ideen dazu?
PS: session_write_close() hinzufügen; vor dem Streaming löst die Datei das Problem. Aber es sieht ein bisschen zu Hacky für mich ...
<video style="width:100%;" preload="metadata" controls="">
<source src="/uploads/getfile?image_path=5%2FOKzAAFlSub-VLsnFWvkPWXBLluwOV-Q5DIuqJkPpDubahlAosK.mp4&type=20" type="video/mp4">
Your browser does not support the video tag.
</video>
PHP-Code:
$file = Yii::getAlias('@app') . '/../files/uploads/' .$image_path;
$fp = @fopen($file, 'rb');
$size = filesize($file); // File size
$length = $size; // Content length
$start = 0; // Start byte
$end = $size - 1; // End byte
header('Content-type: video/mp4');
header("Accept-Ranges: 0-$length");
header("Accept-Ranges: bytes");
if (isset($_SERVER['HTTP_RANGE'])) {
$c_start = $start;
$c_end = $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 $start-$end/$size");
exit;
}
if ($range == '-') {
$c_start = $size - substr($range, 1);
}else{
$range = explode('-', $range);
$c_start = $range[0];
$c_end = (isset($range[1]) && is_numeric($range[1])) ? $range[1] : $size;
}
$c_end = ($c_end > $end) ? $end : $c_end;
if ($c_start > $c_end || $c_start > $size - 1 || $c_end >= $size) {
header('HTTP/1.1 416 Requested Range Not Satisfiable');
header("Content-Range: bytes $start-$end/$size");
exit;
}
$start = $c_start;
$end = $c_end;
$length = $end - $start + 1;
fseek($fp, $start);
header('HTTP/1.1 206 Partial Content');
}
header("Content-Range: bytes $start-$end/$size");
header("Content-Length: ".$length);
$buffer = 1024 * 8;
while(!feof($fp) && ($p = ftell($fp)) <= $end) {
if ($p + $buffer > $end) {
$buffer = $end - $p + 1;
}
set_time_limit(0);
echo fread($fp, $buffer);
ob_flush();
}
fclose($fp);
exit();
Danke für die Informationen. Die Sache ist, dass wir Inhalte haben, die nur für einige Leute sichtbar sein sollten und nicht für alle. Die Dateien werden also nicht öffentlich gespeichert. Im Moment sollte unser System nur ein paar Leuten dienen - es ist kein System für Tausende;) – Lugaru