Dies ist etwas mit meinem anderen PHP-Video-Streaming-Beitrag verwandt, aber diesmal ist das Problem, dass die Suchleiste für die Videos in Chrome nicht funktioniert.PHP Video Stream Seekbar Unbrauchbar in Chrome
Ich habe mehrere verschiedene Beiträge hier bei Stack Overflow gefunden, aber keiner von ihnen hat das Problem gelöst. Ich würde sie alle verlinken, aber ich kann nicht die gleichen Posts finden, die ich gestern gefunden habe.
Ich werde zwei Versionen des PHP-Codes auflisten. Ich sollte auch darauf hinweisen, was genau ich mache, bevor PHP die Videodaten lädt. Auf einer HTML-Seite habe ich einenTag ohne <source>
Tags. Ich benutze Javascript, um einen AJAX-Aufruf an eine PHP-Datei mit den Quellentags vorzunehmen. Die Quell-Tags selbst enthalten keine direkten Links zu den Video-Quelldateien. Stattdessen verweisen sie auf eine andere PHP-Datei, die die Daten lädt.
Top-Level-HTML für Video. Super einfach.
<video id="showvideo" height="540" width="864" controls></video>
Jetzt für die Ajax-Aufruf
function showVideo() {
if (window.XMLHttpRequest) {
// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();
} else {
// code for IE6, IE5
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
document.getElementById("showvideo").innerHTML = xmlhttp.responseText;
}
}
xmlhttp.open("GET", "/firstphpfile.php", true);
xmlhttp.send();
}
Die Funktion Javascript lädt, wenn die Seite geladen wird.
Hier ist der Inhalt von firstphpfile.php
<?php
echo "
<source src=\"http://example.com/video1.php?type=stuff.mp4\" type=\"video/mp4\">
<source src=\"http://example.com/video2.php?type=stuff.ogv\" type=\"video/ogg\">
";
?>
Wieder keine große Sache. Jetzt werde ich ein paar verschiedene Versionen der video1.php-Datei veröffentlichen, die tatsächlich die Datei-Ressource ergreift.
Version 1:
<?php
$file = video.mp4;
$filesize = filesize($file);
$offset = 0;
$length = $filesize;
if (isset($_SERVER['HTTP_RANGE'])) {
// if the HTTP_RANGE header is set we're dealing with partial content
$partialContent = true;
// find the requested range
// this might be too simplistic, apparently the client can request
// multiple ranges, which can become pretty complex, so ignore it for now
preg_match('/bytes=(\d+)-(\d+)?/', $_SERVER['HTTP_RANGE'], $matches);
$offset = intval($matches[1]);
$length = intval($matches[2]) - $offset;
} else {
$partialContent = false;
}
$file = fopen($file, 'r');
// seek to the requested offset, this is 0 if it's not a partial conten request
fseek($file, $offset);
$data = fread($file, $length);
fclose($file);
if ($partialContent) {
// output the right headers for partial content
header('HTTP/1.1 206 Partial Content');
header('Content-Range: bytes ' . $offset . '-' . ($offset + $length) . '/' . $filesize);
}
// output the regular HTTP headers
header("Content-Type:video/mp4");
header('Content-Length: $filesize');
header('Accept-Ranges: bytes');
// don't forget to send the data too
print($data);
?>
Version 2 (Ich mag diese eine besser für das, was es tut, in Firefox, aber immer noch keine Würfel in Chrome)
<?php
$file = video.mp4;
$mime = "video/mp4"; // The MIME type of the file, this should be replaced with your own.
$size = filesize($file); // The size of the file
// Send the content type header
header('Content-type: ' . $mime);
// Check if it's a HTTP range request
if(isset($_SERVER['HTTP_RANGE'])){
// Parse the range header to get the byte offset
$ranges = array_map(
'intval', // Parse the parts into integer
explode(
'-', // The range separator
substr($_SERVER['HTTP_RANGE'], 6) // Skip the `bytes=` part of the header
)
);
// If the last range param is empty, it means the EOF (End of File)
if(!$ranges[1]){
$ranges[1] = $size - 1;
}
// Send the appropriate headers
header('HTTP/1.1 206 Partial Content');
header('Accept-Ranges: bytes');
header('Content-Length: ' . ($ranges[1] - $ranges[0])); // The size of the range
// Send the ranges we offered
header(
sprintf(
'Content-Range: bytes %d-%d/%d', // The header format
$ranges[0], // The start range
$ranges[1], // The end range
$size // Total size of the file
)
);
// It's time to output the file
$f = fopen($file, 'rb'); // Open the file in binary mode
$chunkSize = 8192; // The size of each chunk to output
// Seek to the requested start range
fseek($f, $ranges[0]);
// Start outputting the data
while(true){
// Check if we have outputted all the data requested
if(ftell($f) >= $ranges[1]){
break;
}
// Output the data
echo fread($f, $chunkSize);
// Flush the buffer immediately
@ob_flush();
flush();
}
}
else {
// It's not a range request, output the file anyway
header('Content-Length: ' . $size);
// Read the file
@readfile($file);
// and flush the buffer
@ob_flush();
flush();
}
?>
So, während sowohl das Video abspielen ohne Probleme, nur die Firefox-Version lässt mich jede Art von Suche machen. Die zweite Version macht es so, dass man nur rückwärts suchen kann, was ich bevorzuge.
Es gab eine andere Version, die ich ausprobierte, aber ich hatte den Code bereits vor dem Schreiben gelöscht und habe ihn nicht wieder gefunden.
Ich bin mir nicht sicher, was ich falsch mache und keine Lösungen, die ich gefunden habe, löste das Problem, die Chrome-Version des Videos suchen zu lassen.