7

这是我通过 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。甚至流媒体也适用于所有其他智能手机。您的帮助将不胜感激。

谢谢

4

3 回答 3

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-EncodingContent-Disposition从更改attachmentinline

于 2013-02-19T07:39:24.487 回答
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);

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

于 2014-06-15T08:09:59.077 回答
1

我知道这已经过时了,但我们只是在 iOS 上遇到了同样的问题。

基本上,如果您的应用程序使用本机播放器读取文件,您似乎需要实现Accept-Ranges206 Partial Content才能读取您的文件。

在我们的例子中,文件总共有 4 分钟长。该应用程序将播放大约 1 分 50 秒,然后循环回到开头。它不会检测文件的总长度。
即使我们已将 Accept-Ranges 设置为 none,iOS 仍会忽略它,并且仍在请求文件的某些部分。由于我们要返回整个内容,因此它在下一个“范围”读取时“循环”回到开头。

对于部分内容的实现,我们使用了https://mobiforge.com/design-development/content-delivery-mobile-devices,附录 A:Thomas Thomassen 的 Apple iPhone 流媒体

我希望这可以帮助别人

于 2016-02-22T15:12:38.367 回答