PHP Stream mp3文件

时间:2012-07-14 18:14:18

标签: php stream mp3 filestream

我需要允许用户流式传输它而不下载该文件我该怎么办? 另一个问题,这个代码我有问题,首先下载文件然后播放?

<?php $file = isset($_GET['q']) ? dirname(__FILE__) . base64_decode($_GET['q']) : false;
$file = urldecode(str_replace('/', '\\', $file));
$download = isset($_GET['d']) ? $_GET['d'] == 't' ? true : false : false;
if ($file) {
$disabelStr = 'DisableTrackDownload-';
$pattern = '/'.$disabelStr.'/';
$disableDownload = preg_match($pattern,$file);
$isFile = is_file($file);
// check if file exists
if($isFile){
    // Getting headers sent by the client.
    $headers = apache_request_headers();
    if(isset($headers['Connection'])){
        // stream audio files
        header("Content-Type: audio/mpeg");
        header('Content-Length:'.filesize($file));
        header('Content-Disposition: inline; filename="stream.file"');
        header('X-Pad: avoid browser bug');
        header("Cache-Control: no-store, no-cache, must-revalidate");
        header("Expires: -1");
        ob_clean();
        flush();
        readfile($file);
    }else{
        // disable download
        header ("HTTP/1.0 404 Not Found");
    }
    exit;
}
}
?>

1 个答案:

答案 0 :(得分:4)

第1部分:一般流媒体。

“MP3流”与HTTP下载不同。正确的流需要流媒体服务器(例如Shoutcast),并且通常是直播的转码版本或大型音频文件的按需版本,其中可以立即开始播放而不是等待整个文件下载。

通过HTTP提供MP3文件并不构成真正的“流媒体”,即使客户端(如Winamp,Quicktime Player等)能够在下载之前播放该文件。

为此,您无法提供来自PHP的MP3流,原因应该是显而易见的(即PHP是一个“短暂的”流程,并不适用于长期生命的请求,例如HTTP上的流)。 / p>

您所描述的场景是提供MP3文件的标准HTTP下载,但使用可以立即开始播放的客户端。请注意,由于客户端的工作方式(一般情况下),您无法阻止人们保存下载的文件。

我想你可以限制对已知客户端的访问(通过User-agent标题)但这是一个邪恶的例子。请不要做这样的事情。


第2部分:您的代码

您的PHP代码使用Content-disposition标头向浏览器提示应将文件下载到文件系统而不是传递给外部程序或插件的URL。删除标题,您会发现某些浏览器将启动MP3播放器,但其他人仍会提示用户将文件保存到磁盘(通常是因为用户偏好,或者可能缺少安装了MP3播放器。)

此外,请勿使用HTTP 404拒绝请求。使用HTTP 403 Forbidden更准确地描述您正在做的事情。