2016-10-03 2 views
0

형식 확장자가 .m3u8 인 실시간 스트리밍 링크가 있습니다. 저는 그것을 내 페이지에 게시하고 싶습니다. 는이 코드를 시도했지만 작업PHP를 사용하여 실시간 스트리밍을 만드는 방법은 무엇입니까?

<?php 
$file = 'http://93.87.85.70/PLTV/88888888/224/3221226661/04.m3u8'; 
$fp = @fopen($file, 'rb'); 
$size = filesize($file); // File size 
$length = $size;   // Content length 
$start = 0;    // Start byte 
$end = $size - 1;  // End byte 
header('Content-type: video/mp4'); 
//header("Accept-Ranges: 0-$length"); 
header("Accept-Ranges: bytes"); 
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(); 
?> 

뭔가 잘못이 아니면 내가 뭔가를 추가하는 데 필요한 오전 does'nt? 또는이 코드가 잘못된 경우 다른 방법을 사용하십시오.

+0

어떤 오류 메시지가 나타 납니까? 오류 로그에는 무엇이 있습니까? – twigg

+0

파일이 비디오 플레이어에로드되지 않았습니다. –

답변

1

.m3u8은 MP4 비디오가 아닌 재생 목록 파일입니다. 일반적으로 HLS 스트림과 함께 사용됩니다.

HLS 스트림은 전체 파일 모음으로 구성됩니다. 재생 목록에는 몇 초마다 오디오/비디오 파일 세그먼트가있을 것이며, 몇 비트 레이트로 재생 될 것입니다. 재생 목록은 정기적으로 업데이트됩니다.

이러한 파일을 프록시하려고해도 스크립트는이를 수행 할 수 없습니다. 웹 서버 (Nginx, Apache, 당신이 사용하는 곳)에 맡겨 두는 것이 가장 좋습니다. 스크립트가 업스트림 콘텐츠 유형, 헤더 등을 준수하지 않습니다. fopen()의 모든 오류도 무시합니다. 어쨌든 URL에 fopen()을 사용하지 않을 것입니다 ... 래퍼가 항상 활성화되지는 않으며 실제 상태 코드와 헤더에 액세스 할 수 없습니다. 마지막으로 업스트림 경로를 하드 코드하여 사용자가 미디어 파일이 아닌 재생 목록 만 가져올 수 있도록했습니다.

JWPlayer와 비슷한 HLS를 처리하는 것보다 클라이언트 측 플레이어를 사용해야합니다. 이것은 PHP와는 아무런 관련이 없습니다. JavaScript 및 Media Source Extensions API로 완성됩니다.

관련 문제