2012-07-05 7 views
8

私でした。このPHPスクリプトメイクmp3シーク可能なPHP

 

    $file_name = 'sample.mp3'; 

    header('Content-Type: audio/mpeg'); 

    $opts  = array('http' => 
         array(
          'method'   => 'GET', 
          'protocol_version' => 1.1, 
        ) 
    ); 
    $context = stream_context_create($opts); 
    $stream = fopen($file_name, 'rb', FALSE, $context); 
    $metadata = stream_get_meta_data($stream); 
    $data  = stream_get_contents($stream); 
    print($data); 
    fclose($stream); 

それが正常にmp3メディアをストリーミングすることができますが、私は videoタグがメタデータを抽出することができませんHTML5でもプレイしますmp3ファイルを模索することはできませんよ

そこから、私が間違ってやっていることを教えてください、このプロセスを働かせる方法、ありがとう

答えて

1

これはあなたの問題をうまくいけば、この方法に従うべきです。

readfile()を使用し、file_exists()を設定して、正しいファイルを開いていることを伝えることができます。

$extension = "mp3"; 
$mime_type = "audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3"; 

if(file_exists($file_name)){ 
    header('Content-type: {$mime_type}'); 
    header('Content-length: ' . filesize($file_name)); 
    header('Content-Disposition: filename="' . $file_name); 
    header('X-Pad: avoid browser bug'); 
    header('Cache-Control: no-cache'); 
    readfile($file_name); 
} 

Reference

+0

私はそれがどのようにできた、バッファリングしたいですか? –

+0

上で述べたように、これには 'Content-Range'はありません。 Chromeでは、現在の時間を設定することはできません(5年後)。 – Agamemnus

+0

header( 'Content-type ...二重引用符が抜けていて解決策が動作しません。 –

18

ここで部分的なダウンロードをサポートし、これを試してみて、任意のファイルサイズを求めて、また正しくクロームで動作します:

<?php 
$file_name = './sample.mp3'; 
stream($file_name, 'audio/mpeg'); 

/** 
* Stream-able file handler 
* 
* @param String $file_location 
* @param Header|String $content_type 
* @return content 
*/ 
function stream($file, $content_type = 'application/octet-stream') { 
    @error_reporting(0); 

    // Make sure the files exists, otherwise we are wasting our time 
    if (!file_exists($file)) { 
     header("HTTP/1.1 404 Not Found"); 
     exit; 
    } 

    // Get file size 
    $filesize = sprintf("%u", filesize($file)); 

    // Handle 'Range' header 
    if(isset($_SERVER['HTTP_RANGE'])){ 
     $range = $_SERVER['HTTP_RANGE']; 
    }elseif($apache = apache_request_headers()){ 
     $headers = array(); 
     foreach ($apache as $header => $val){ 
      $headers[strtolower($header)] = $val; 
     } 
     if(isset($headers['range'])){ 
      $range = $headers['range']; 
     } 
     else $range = FALSE; 
    } else $range = FALSE; 

    //Is range 
    if($range){ 
     $partial = true; 
     list($param, $range) = explode('=',$range); 
     // Bad request - range unit is not 'bytes' 
     if(strtolower(trim($param)) != 'bytes'){ 
      header("HTTP/1.1 400 Invalid Request"); 
      exit; 
     } 
     // Get range values 
     $range = explode(',',$range); 
     $range = explode('-',$range[0]); 
     // Deal with range values 
     if ($range[0] === ''){ 
      $end = $filesize - 1; 
      $start = $end - intval($range[0]); 
     } else if ($range[1] === '') { 
      $start = intval($range[0]); 
      $end = $filesize - 1; 
     }else{ 
      // Both numbers present, return specific range 
      $start = intval($range[0]); 
      $end = intval($range[1]); 
      if ($end >= $filesize || (!$start && (!$end || $end == ($filesize - 1)))) $partial = false; // Invalid range/whole file specified, return whole file 
     } 
     $length = $end - $start + 1; 
    } 
    // No range requested 
    else $partial = false; 

    // Send standard headers 
    header("Content-Type: $content_type"); 
    header("Content-Length: $filesize"); 
    header('Accept-Ranges: bytes'); 

    // send extra headers for range handling... 
    if ($partial) { 
     header('HTTP/1.1 206 Partial Content'); 
     header("Content-Range: bytes $start-$end/$filesize"); 
     if (!$fp = fopen($file, 'rb')) { 
      header("HTTP/1.1 500 Internal Server Error"); 
      exit; 
     } 
     if ($start) fseek($fp,$start); 
     while($length){ 
      set_time_limit(0); 
      $read = ($length > 8192) ? 8192 : $length; 
      $length -= $read; 
      print(fread($fp,$read)); 
     } 
     fclose($fp); 
    } 
    //just send the whole file 
    else readfile($file); 
    exit; 
} 
?> 
+0

これを試してみましたが、PHPファイルのアドレスをVLCにコピーするとうまく動作しますが、HTML5オーディオタグにリンクを追加すると、 PHPの警告:ヘッダー情報を変更できません - ヘッダーは既に送信されています。ありがとうございます。 – joshkrz

+1

@joshkrz - 出力を送信しないように注意してください(空白、 html)ヘッダーを設定する前にエラーが表示されます。 –

+0

どうやら私は89行目に出力しています。[print($ download_data_chunk);]エラーは、コード内にヘッダーが設定されている行をすべて表示します。奇妙なことに、このスクリプトへの直接リンクを入力すると、Google Chrome MP3プレーヤーが表示されますが、何もしません。私はこれを行うとエラーは発生しません。スクリプトには余分なエコーやプリントがありません。 – joshkrz

関連する問題