2016-02-10 48 views
0

我正在實現一個服務於mp4文件的HTML5視頻播放器。PHP即時服務mp4(在加載所有內容之前)

當我使用普通的mp4文件作爲播放源時,視頻很快就會啓動,我還可以尋找尚未下載的部分。

現在,我要確保我的視頻文件,即它們存儲以下Web根目錄和視頻SRC是一個PHP文件,支票,如果允許用戶觀看視頻。

所以我的HTML看起來像這樣:

... 
<video src="http://videoserver.com/stream.php?file=videoxy.mp4"> 
... 

而且stream.php:

... 
if ($access_granted) { 
    if ($fd = fopen($path, "rb")) { 
    $fsize = filesize($path); 
    header("Content-Type: video/mp4"); 
    header("Content-Disposition: inline; filename=\"".$filename."\""); 
    header('Content-Transfer-Encoding: binary'); 
    header("Content-Length: $fsize"); 
    fpassthru($fd); 
    } else { 
    die('file not found'); 
    } 
} else { 
    die('forbidden'); 
} 
... 

現在,視頻仍然會出場,但只後的視頻完全下載。

如何在下載所有內容之前啓動視頻?此外,我想尋求還沒有下載的部分工作。

回答

3

我發現從這個gist的解決方案是工作:

... 
if ($access_granted) { 
    if ($fp = fopen($path, "rb")) { 
    $size = filesize($path); 
    $length = $size; 
    $start = 0; 
    $end = $size - 1; 
    header('Content-type: video/mp4'); 
    header("Accept-Ranges: 0-$length"); 
    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); 
     flush(); 
    } 
    fclose($fp); 
    exit(); 
    } else { 
    die('file not found'); 
    } 
} else { 
    die('forbidden'); 
} 
... 
相關問題