我建立了一个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文件。
答案 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)
要解决此问题,您必须安装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');
希望这有帮助