通过php流式传输mp3文件

时间:2013-02-19 07:36:41

标签: php streaming

这是我通过php流式传输mp3文件的php代码

set_time_limit(0);
$dirPath = "path_of_the_directory";
$songCode = $_REQUEST['c'];
$filePath = $dirPath . "/" . $songCode . ".mp3";
$strContext=stream_context_create(
    array(
        'http'=>array(
        'method'=>'GET',
        'header'=>"Accept-language: en\r\n"
        )
    )
);
$fpOrigin=fopen($filePath, 'rb', false, $strContext);
header('content-type: application/octet-stream');
while(!feof($fpOrigin)){
  $buffer=fread($fpOrigin, 4096);
  echo $buffer;
  flush();
}
fclose($fpOrigin);

它适用于Mac Mini和所有其他PC,但不适用于iPad和iPhone。甚至流媒体也适用于所有其他智能手机。感谢您的帮助。

由于

3 个答案:

答案 0 :(得分:3)

为什么content-type: application/octet-stream如果是一首歌?更改标题:

set_time_limit(0);
$dirPath = "path_of_the_directory";
$songCode = $_REQUEST['c'];
$filePath = $dirPath . "/" . $songCode . ".mp3";
$strContext=stream_context_create(
    array(
        'http'=>array(
        'method'=>'GET',
        'header'=>"Accept-language: en\r\n"
        )
    )
);
$fpOrigin=fopen($filePath, 'rb', false, $strContext);
header('Content-Disposition: inline; filename="song.mp3"');
header('Pragma: no-cache');
header('Content-type: audio/mpeg');
header('Content-Length: '.filesize($filePath));
while(!feof($fpOrigin)){
  $buffer=fread($fpOrigin, 4096);
  echo $buffer;
  flush();
}
fclose($fpOrigin);

LE:已移除Content-Transfer-Encoding并将Content-Dispositionattachment更改为inline

答案 1 :(得分:3)

<?php
set_time_limit(0);
$dirPath = "path_of_the_directory";
$songCode = $_REQUEST['c'];
$filePath = $dirPath . "/" . $songCode . ".mp3";
$bitrate = 128;
$strContext=stream_context_create(
     array(
         'http'=>array(
         'method'=>'GET',
         'header'=>"Accept-language: en\r\n"
         )
     )
 );


 header('Content-type: audio/mpeg');
 header ("Content-Transfer-Encoding: binary");
 header ("Pragma: no-cache");
 header ("icy-br: " . $bitrate);

 $fpOrigin=fopen($filePath, 'rb', false, $strContext);
 while(!feof($fpOrigin)){
   $buffer=fread($fpOrigin, 4096);
   echo $buffer;
   flush();
 }
 fclose($fpOrigin);

我知道这篇文章来自去年,但有人可能会觉得这很有用。这将流式传输内容。

答案 2 :(得分:1)

我知道这已经过时了,但我们只是碰到了与iOS相同的问题。

基本上,如果您的应用使用原生播放器来阅读文件,您需要为您的文件实施接受范围 206部分内容读。

在我们的案例中,发生的事情是该文件总共有4分钟。该应用程序将播放约1分50秒,然后将循环回到开始。它不会检测文件的总长度 即使我们将Accept-Ranges设置为none,iOS也忽略了它,并且仍然要求部分文件。既然我们正在回归整个事情,那就是&#34;循环&#34;回到下一个&#34;范围&#34;读取。

为了实现部分内容,我们使用了https://mobiforge.com/design-development/content-delivery-mobile-devices,附录A:Thomas Thomas为Apple iPhone流式传输

我希望这有助于某人