2016-10-03 3 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ストリームは、ファイル全体の集合で構成されています。プレイリストには数秒ごとに複数のビットレートでオーディオ/ビデオファイルセグメントが存在します。プレイリストは定期的に更新されます。

これらのファイルをプロキシしたかったとしても、スクリプトではできません。それがベストであるように、Webサーバ(Nginx、Apache、あなたが使っているもの)に任せておくのがベストです。あなたのスクリプトは上流のコンテンツタイプ、ヘッダーなどを尊重していません。また、fopen()のエラーも無視しています。とにかくURLにfopen()を使用しません。ラッパーは常に有効になっているわけではありません。実際のステータスコードとヘッダーにはアクセスできません。最後に、ユーザがアップストリームパスをハードコーディングしたので、ユーザはメディアファイルではなくプレイリストのみを取得します。

JWPlayerなどのHLSを処理するよりも、クライアント側のプレーヤーを使用するだけで済みます。これはPHPとは関係ありません。これは、JavaScriptとMedia Source Extensions APIで行われます。

関連する問題