readfile()和header()的问题

时间:2010-08-30 18:47:08

标签: php html

我有一个mp3处理程序,我用它来提供mp3,原因有很多。在远程环境中使用处理程序时,我意识到IE,Safari和Google Chrome存在问题。问题是,播放mp3文件,然后在大约20秒后重新启动。这在Opera或Firefox中不会发生。直接流式传输文件没有问题,因此它必须是处理程序,但由于某些原因,流式传输在所有浏览器的本地环境中都有效。无论如何,这是我的代码,我认为问题是header()或readfile(),但如果删除标题,问题仍然会发生。对此非常感激。

PHP

$path="folder/$file_id/$mp3_name";

header('Content-type: audio/mpeg');

header('Content-Length: '.filesize($path)); // provide file size

header("Expires: -1");

header("Cache-Control: no-store, no-cache, must-revalidate");

header("Cache-Control: post-check=0, pre-check=0", false);

readfile($path);

播放器

<object width="165" height="37" id="niftyPlayer1" align="">
<param name="wmode" value="transparent">
<param name=movie value="nifty/niftyplayer.swf?file=handler.php%3FID%3DDelete   930209d6459ad1e5436ba84040cd577e&as=1">
<param name=quality value=high>
<param name=bgcolor value=#FFFFFF>
<embed src="nifty/niftyplayer.swf?file=handler.php%3FID%3D930209d6459ad1e5436ba84040cd577e&as=1";
quality=high bgcolor=#FFFFFF width="165" height="37" name="niftyPlayer1" align="" type="application/x-shockwave-flash" swLiveConnect="true" wmode="transparent">
</embed>
</object>

2 个答案:

答案 0 :(得分:3)

只要您是流媒体,就必须支持部分下载。

PHP和readfile()的问题在于它默认不会处理部分下载。基本上,如果下载因某种原因而被切断(或者播放器临时停止缓冲),UA需要从头开始再次开始下载文件(这会导致媒体再次开始播放)。

通过部分下载,UA可以简单地请求再次开始下载的字节范围。

某些PHP库(如PEAR::HTTP_Download)将为您处理部分下载:

$dl = new HTTP_Download();
$dl->setFile("folder/$file_id/$mp3_name");
$dl->setContentDisposition(HTTP_DOWNLOAD_ATTACHMENT, $mp3_name);
$dl->setContentType('audio/mpeg');
$dl->send();

这就是使用PEAR::HTTP_Download时所需的所有代码。它将自动为您处理部分下载支持,并应该停止重新启动媒体的问题。

答案 1 :(得分:1)

如果你的代码正确地提供了MP3(根据你所说的那样),这似乎是一个特别的Nifty播放器问题。

你不是以某种方式初始化玩家两次,是吗?

MP3播放20秒后重启,是否正常播放?或者是否每隔20秒钟不断重置一次?