【问题标题】:php streaming or buffering mp3 file problemphp流或缓冲mp3文件问题
【发布时间】:2011-04-28 15:32:59
【问题描述】:

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

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

如果 url 来自其他站点,例如 Google 音乐,它可以正确播放 mp3 文件。

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

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

<?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 文件。

【问题讨论】:

  • 可流式和不可流式文件最不同的是:如果你用Chrome打开mp3文件,可以看到加载状态(蓝色的),你可以随时随地播放(使用滚动条)。如果打开不可流式播放的 mp3 文件,您将看不到加载状态,也无法在任何时间播放。
  • 其实我试过 fopen() 和 readfile() 两个都不起作用

标签: php header stream mp3 buffer


【解决方案1】:

我也遇到过这个问题。我使用 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);

【讨论】:

    【解决方案2】:

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

    要解决这个问题,你必须安装 gnump3d 来启用流媒体服务器。

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

    【讨论】:

      【解决方案3】:

      一方面,使用“Accept-ranges”标头意味着您的脚本告诉浏览器它可以请求文件的特定部分,但您无条件发送整个内容。至少切换到使用none 而不是bytes 来表明您不允许范围请求,或者完全消除标头。

      第二,做:

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

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

      【讨论】:

      • “Accept-Ranges: bytes”标题是我在 Google 音乐中找到的。而且我还测试了“Accept-Ranges:none”或消除它,它仍然不起作用。
      【解决方案4】:

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

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

      希望对你有帮助

      【讨论】:

      • 'Content-Disposition: attachment' 将导致浏览器下载文件。
      • 是的,当文件作为附件处理时,一些 Flash 流媒体效果更好
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-14
      • 1970-01-01
      • 2017-04-06
      • 1970-01-01
      • 1970-01-01
      • 2010-10-09
      • 1970-01-01
      相关资源
      最近更新 更多