php流式传输或缓冲mp3文件问题

时间:2010-10-21 14:06:11

标签: php header stream mp3 buffer

我建立了一个mp3播放网站。

我使用flash mp3播放器播放mp3文件。它可以播放,但无法加载正确的时间,也无法流式传输和缓冲位于我服务器上的mp3文件。

如果网址来自其他网站,则可以正确播放mp3文件,例如Google音乐。

我认为重要的问题是mp3文件的标题输出。

这是我输出mp3文件的php文件的代码。

<?php
 $filename='music/'.$_GET['id'].'.mp3';
 $fileSize=filesize($filename);
 header('Accept-Ranges: bytes');
 header('Cache-Control: max-age=604800');
 header('Content-Length: ' . $fileSize);
 header('Content-type: audio/mpeg');
 readfile($filename);
?>

谁能告诉我问题是什么?

PS:您可以在Chrome上进行测试。只需使用Chrome打开文件或页面,它就会显示播放器播放mp3文件。

4 个答案:

答案 0 :(得分:3)

我也经历过这个问题。我用PHP的readfile()-function解决了它。我不知道为什么会有效,但确实如此。此外,它缩短了您的代码并使用更少的内存:

$filename = 'music/'.$_GET['id'].'.mp3';
header('Cache-Control: max-age=604800');
header('Content-type: audio/mpeg');
header('Content-Transfer-Encoding: binary');
header('Content-Length: '.filesize($filename));
readfile($filename);

答案 1 :(得分:2)

好的,问题解决了。实际问题是Liunx系统(如CentOS和Ubuntu)不支持mp3流媒体。

要解决此问题,您必须安装gnump3d才能启用流服务器。

我的网站mu6.me现在可以像其他音乐网站一样播放音乐。

答案 2 :(得分:1)

首先,使用'Accept-ranges'标题意味着您的脚本告诉浏览器它可以请求文件的特定部分,但您无条件地发送整个文件。至少切换到使用none而不是bytes来表示您不允许范围请求,或完全取消标头。

第二,做:

print(fread($mp3, $fileSize - 10000 )); 

很奇怪。无论mp3实际上有多大或多小,你都会发送最多两个块。第一个块将是整个文件减去最后10,000个字节,第二个块(如果文件的长度> 10,000个字节)将是最终的10,000个字节。如果你有一个大型的mp3,以这种方式发送它可能超过php的memory_limit并杀死脚本。 MP3播放器可能没有注意到这一点,因为它会愉快地播放已经发送的曲调部分。只需使用readfile()代替整个fopen / while / fclose业务,它将以足够小的块正确发送文件,以便不超过内存限制。

答案 3 :(得分:1)

您是否尝试过添加文件名?

header('Content-Disposition: attachment; filename="media.mp3"');
header('Pragma: no-cache');

希望这有帮助