2014-04-11 5 views
1

나는 당황 스럽다. 해결할 수없는 문제가있다.PHP를 통해로드 할 때 Chrome에서 파일을 찾을 수없는 WebM 파일 (다른 브라우저가 작동 함)

PHP를 통해 WebM 파일을 제공하는 것은 새로운 세계에서는 새로운 것이 아니며 HTTP 206 부분 콘텐츠로 작업하는 방법조차 알고 있습니다. 하지만 어떤 이유로 크롬은 좋아하지 않습니다.

는 간단한 HTML5 비디오 재생 /video/V00000006.webm이 아파치에 PHP 파일을 다시 작성

<video width="640" height="360" poster="picture/preview/V00000006.jpg" controls="controls" preload> 
    <source type="video/webm" src="/video/V00000006.webm"> 
</video> 

은 잘 재생됩니다. 하지만 크롬에서는 검색 바가 효과적이지 않습니다. 검색 바를 클릭하면 플레이어가 멈추고 페이지가 새로 고침 될 때까지 더 이상 재생되지 않습니다. Firefox가 제대로 처리합니다!

만약 /video/V00000006.webm을 (를) 동일한 비디오의 링크로 변경하면 작동합니다. 나는 심지어 두 가지 버전 (PHP 사용 여부에 관계없이)의 네트워크 요청을 비교해 보았지만 첫 번째 요청에는 거의 차이가 없었지만 두 번째 요청은 PHP 제공 비디오에서 실패했습니다.

초기 요청 및 아파치 전달 비디오 파일에 대한 요청 추구 :

 
    Request URL:http://mytestserver.net/movie1152x720.webm 
    Request Method:GET 
    Status Code:206 Partial Content 
    Request Headers 
    Accept:*/* 
    Accept-Encoding:identity;q=1, *;q=0 
    Accept-Language:da-DK,da;q=0.8,en-US;q=0.6,en;q=0.4 
    Cache-Control:no-cache 
    Connection:keep-alive 
    Cookie:PHPSESSID=i562540rek172mnv3nk528acj0; userPassword=; userEmail= 
    Host:mytestserver.net 
    Pragma:no-cache 
    Range:bytes=0- 
    Referer:http://mytestserver.net/video.html 
    User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36 
    Response Headers 
    Accept-Ranges:bytes 
    Connection:close 
    Content-Length:4446451 
    Content-Range:bytes 0-4446450/4446451 
    Content-Type:video/webm 
    Date:Fri, 11 Apr 2014 13:07:30 GMT 
    ETag:"d2d0027-43d8f3-b91417c0" 
    Last-Modified:Fri, 11 Apr 2014 12:46:31 GMT 
    Server:Apache/2.2.3 (CentOS) 

    -- 

    Request URL:http://mytestserver.net/movie1152x720.webm 
    Request Method:GET 
    Status Code:206 Partial Content 
    Request Headers 
    Accept:*/* 
    Accept-Encoding:identity;q=1, *;q=0 
    Accept-Language:da-DK,da;q=0.8,en-US;q=0.6,en;q=0.4 
    Cache-Control:no-cache 
    Connection:keep-alive 
    Cookie:PHPSESSID=i562540rek172mnv3nk528acj0; userPassword=; userEmail= 
    Host:mytestserver.net 
    Pragma:no-cache 
    Range:bytes=4445881- 
    Referer:http://mytestserver.net/video.html 
    User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36 
    Response Headers 
    Accept-Ranges:bytes 
    Connection:close 
    Content-Length:570 
    Content-Range:bytes 4445881-4446450/4446451 
    Content-Type:video/webm 
    Date:Fri, 11 Apr 2014 13:09:02 GMT 
    ETag:"d2d0027-43d8f3-b91417c0" 
    Last-Modified:Fri, 11 Apr 2014 12:46:31 GMT 
    Server:Apache/2.2.3 (CentOS) 

초기 요청을하고 PHP - 스트리밍 비디오에 대한 요청 추구 :

 
    Request URL:http://mytestserver.net/video/V00000006.webm 
    Request Method:GET 
    Status Code:206 Partial Content 
    Request Headers 
    Accept:*/* 
    Accept-Encoding:identity;q=1, *;q=0 
    Accept-Language:da-DK,da;q=0.8,en-US;q=0.6,en;q=0.4 
    Cache-Control:no-cache 
    Connection:keep-alive 
    Cookie:PHPSESSID=i562540rek172mnv3nk528acj0; userPassword=; userEmail= 
    Host:mytestserver.net 
    Pragma:no-cache 
    Range:bytes=0- 
    Referer:http://mytestserver.net/video.html 
    User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36 
    Response Headers 
    Accept-Ranges:bytes 
    Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
    Connection:close 
    Content-Length:8566268 
    Content-Range:bytes 0-8566267/8566268 
    Content-Type:video/webm 
    Date:Fri, 11 Apr 2014 13:31:27 GMT 
    Expires:Thu, 19 Nov 1981 08:52:00 GMT 
    Pragma:no-cache 
    Server:Apache/2.2.3 (CentOS) 
    X-Powered-By:PHP/5.3.27 

    -- 

    Request URL:http://mytestserver.net/video/V00000006.webm 
    Request Headers CAUTION: Provisional headers are shown. 
    Accept-Encoding:identity;q=1, *;q=0 
    Cache-Control:no-cache 
    Pragma:no-cache 
    Range:bytes=4338314- 
    Referer:http://mytestserver.net/video.html 
    User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36 

공지 사항을 어떻게 두 번째 요청 완료되지 않음, 잠정 헤더가으로 표시됩니다.

나는 빈을 설정하고 첨부 파일 헤더를 사용하여, 미래로 설정하면 캐시 헤더을 변경 시도했다.

나는 서빙 코드로 많은 것을 둘러 보았지만, 최근에는 간단한 예를 들었다.

<?php 

$path = 'test.webm'; 

$size=filesize($path); 

[email protected]($path,'rb'); 
if(!$fm) { 
    header ("HTTP/1.0 404 Not Found"); 
    die(); 
} 

$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[0]); 
    if(!empty($matches[1])) { 
     $end=intval($matches[1]); 
    } 
    } 
} 

if($begin>0||$end<$size) 
    header('HTTP/1.0 206 Partial Content'); 
else 
    header('HTTP/1.0 200 OK'); 

header("Content-Type: video/webm"); 
header('Accept-Ranges: bytes'); 
header('Content-Length:'.($end-$begin+1)); 
header("Content-Disposition: inline;"); 
header("Content-Range: bytes $begin-$end/$size"); 
header("Content-Transfer-Encoding: binary\n"); 
header('Connection: close'); 

ob_get_clean(); 
flush(); 

$f = fopen($path, 'r'); 
fseek($f, $offset); 

$pos = 0; 
$length = $end-$begin; 

while($pos < $length) 
{ 
    $chunk = min($length-$pos, 1024); 

    echo fread($f, $chunk); 
    flush(); 

    $pos += $chunk; 
} 
?> 

PHP로 제공되는 비디오 URL을 브라우저에 직접 입력해도 HTML 페이지에 표시되는 것과 차이가 없습니다.

나는 누군가가 탐색이 효과가 없을 수있는 이유에 대한 답을 얻길 바랍니다. 의견이 있으면 알려줘.

감사합니다. 모두의 미래 참고로

답변

1

:

PHP에서 HTTP_RANGE의
  1. 온라인 예 결함
  2. 가득 크롬 네트워크 오류를
  3. 크기 문제를 설명하는 아주 나쁜!

간단히 말해서, 내 문제는 PHP 스크립트가 잘못된 숫자를 계산하여 반환했기 때문입니다. 크롬은 네트워크 요청을 완료하려고 시도조차하지 않았기 때문에 간단히 행동하여 디버깅하기가 어렵습니다.

이제 모든 네트워크 호출을 가져 와서 cURL (Linux 콘솔)에서 가져 왔습니다. (18) 전송이 1 바이트 콘텐츠 길이이 1 바이트 오류가 크롬 네트워크 요청을 취소하고 당신에게 응답을 보여주지 수

을 읽을 나머지 폐쇄 : 여기에 나는 컬과 같은 더 유용한 오류를 얻을 것 헤더가 있고 요청을 취소 한 이유.

여기는 Content-Range 및 Content-Length 계산을 사용하는 작업 코드입니다. $ filesize = 파일 크기 ($ 파일);

$offset = 0; 
$length = $filesize; 

$partialContent = false; 

if(isset($_SERVER['HTTP_RANGE'])) 
{ 
    $partialContent = true; 

    if(!preg_match('/bytes=(\d+)-(\d+)?/', $_SERVER['HTTP_RANGE'], $matches)) 
    { 
     header('HTTP/1.1 416 Requested Range Not Satisfiable'); 
     header('Content-Range: bytes */' . $filesize); 
     exit; 
    } 

    $offset = intval($matches[1]); 

    if(isset($matches[2])) 
    { 
     $end = $intval($matches[2]); 
     if($offset > $end) 
     { 
      header('HTTP/1.1 416 Requested Range Not Satisfiable'); 
      header('Content-Range: bytes */' . $filesize); 
      exit; 
     } 

     $length = $end - $offset; 
    } 
    else 
     $length = $filesize - $offset; 
} 

header('Content-Length: ' . $length); 

if($partialContent) 
{ 
    header('HTTP/1.1 206 Partial Content'); 
    header('Content-Range: bytes ' . $offset . '-' . ($offset + $length - 1) . '/' . $filesize); 
    // A full-length file will indeed be "bytes 0-x/x+1", think of 0-indexed array counts 
} 

는 위의 코드는 단지 부분적인 내용에 관련 코드가 포함되어 유의하시기 바랍니다, 당신은 여전히 ​​실제로 뭔가를 할 등 다른 헤더가 필요합니다.

누구든지 관심이있는 경우 아래 파일을 읽는 코드입니다. 웹상에서 여러 가지 나쁜 제안을 보았지만 제 생각에는 꽤 깨끗합니다.

$f = fopen($file, 'r'); 
fseek($f, $offset); 

$pos = 0; 

while($pos < $length) 
{ 
    $chunk = min($length-$pos, 1024*8); 

    echo fread($f, $chunk); 
    flush(); 
    ob_flush(); 

    $pos += $chunk; 
} 

케이스 행운을 빌어 모든 :-)에 폐쇄