我有一个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>
答案 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秒钟不断重置一次?