2016-05-17 9 views
0

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.

Antwort

0

Ok, also habe ich es endlich zur Arbeit gebracht. Ich entschied mich, die PHP-Dateien nicht mit Javascript zu laden.

Auch ich habe die Mime-Typ-Variable los und setzen Sie einfach den Header richtig. Ich habe festgestellt, dass die Verwendung einer Variablen für den MIME-Typ dazu führt, dass meine Browser den falschen MIME-Typ für den Header des Inhaltstyps laden, wodurch die Videoressource fehlschlägt.