2016-09-29 19 views
0

私は以下のコードスニペットを使用して、PHPを使用してmp4ファイルを読み込み、ビデオタグで再生します。このコードは、シークャを前後に動かすことを可能にするlocalhostのファイル(test.mp4)としてビデオを呼び出すときに機能します。しかし、ビデオソースをURL(http://techslides.com/demos/sample-videos/small.mp4)として使用すると、ビデオは再生されますが、シーカーを前後に動かすことはできません。私が試してみましたPHPを使用してURLからMP4ファイルを読み取る

$filename = 'http://techslides.com/demos/sample-videos/small.mp4'; 
      $mimeType = 'video/mp4'; 

       $ch = curl_init($filename); 
       curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
       curl_setopt($ch, CURLOPT_HEADER, TRUE); 
       curl_setopt($ch, CURLOPT_NOBODY, TRUE); 

       $data = curl_exec($ch); 
       $size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD); 

       curl_close($ch); 

      // echo $size = filesize($filename);die; 
       $time = date('r', filemtime($filename)); 

       $fm = @fopen($filename, 'rb'); 
       if (!$fm) 
       { 
       header ("HTTP/1.1 505 Internal server error"); 
       return; 
       } 

       $begin = 0; 
       $end = $size - 1; 

       if (isset($_SERVER['HTTP_RANGE'])) 
       { 
       if (preg_match('/bytes=\h*(\d+)-(\d*)[\D.*]?/i', $_SERVER['HTTP_RANGE'], $matches)) 
       { 
       $begin = intval($matches[1]); 
       if (!empty($matches[2])) 
       { 
        $end = intval($matches[2]); 
       } 
       } 
       } 
       if (isset($_SERVER['HTTP_RANGE'])) 
       { 
       header('GET HTTP/1.1 206 Partial Content'); 
       } 
       else 
       { 
       header('HTTP/1.1 200 OK'); 
       } 

       header("Content-Type: video/mp4"); 
       header('Accept-Ranges: bytes'); 
       header("Content-Disposition: inline;"); 
       header("Content-Range: bytes $begin-$end/$size"); 
       header("Content-Transfer-Encoding: binary\n"); 
       header('Cache-Control: public, must-revalidate, max-age=0'); 
       header('Pragma: no-cache'); 
       header('Content-Length:' . (($end - $begin) + 1)); 
       if (isset($_SERVER['HTTP_RANGE'])) 
       { 
       header("Content-Range: bytes $begin-$end/$size"); 
       } 
       header('Connection: close'); 
       $cur = $begin; 
       fseek($fm, $begin, 0); 

       while(!feof($fm) && $cur <= $end && (connection_status() == 0)) 
       { 
       print fread($fm, min(1024 * 16, ($end - $cur) + 1)); 
       $cur += 1024 * 16; 
       usleep(1000); 
       } 

答えて

1

は が、fseek関数は、()のhttpをサポートしていないので、 ファイルが、パス

チェックこの回答からファイルを取得しなければならないことを意味するその「シーク」でなければなりません働いていない、その前にやりますhttps://stackoverflow.com/a/21722576/5380308

関連する問題