PHP 流媒体 MP3

2022-01-11 00:00:00 header mp3 readfile php filestream

我的情况与提问的人非常相似:我可以使用 PHP 提供 MP3 文件吗?基本上我试图保护 mp3 文件不被直接下载,所以用户必须先通过 php 来获得身份验证.这是我的代码:

I have a very similar situation to the person who asked: Can I serve MP3 files with PHP? Basically I am trying to protect mp3 files from direct download, so users have to go through php to get authenticated first. Here's my code:

header('Content-type: audio/mpeg');
header('Content-length: ' . filesize($file));
header('X-Pad: avoid browser bug');
Header('Cache-Control: no-cache');
header("Content-Transfer-Encoding: binary"); 
header("Content-Type: audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3");
readfile($file);

这是我的问题:该文件仅播放开头的一小部分(通过浏览器中的 Quicktime)然后停止 - Quicktime 似乎认为文件的长度仅与它管理的块一样长下载.当我重新加载时 - 它会播放一个稍微大一点的块 - 无论它设法下载到那个点.

Here's my problem: The file only plays a very small chunk of the beginning (via Quicktime in the browser) and then stops - Quicktime seems to think the length of the file is only as long as the chunk it managed to download. When I reload - it plays a slightly larger chunk - whatever it managed to download up to that point.

这是我发送的标头中的问题吗?我将如何流式传输这样的文件?如果 swf 正在从该文件中读取,会不会有问题?

Is that a problem in the headers I am sending? How would I stream such a file? Is it a problem if an swf is reading from that file?

谢谢!

谢谢大家的回答.尽管这些东西都不能完全解决问题,但它们中的许多都将我引向了正确的方向.非常感激.有关完整的解决方案,请参阅下面的答案

推荐答案

这就是诀窍.

$dir = dirname($_SERVER['DOCUMENT_ROOT'])."/protected_content";
$filename = $_GET['file'];
$file = $dir."/".$filename;

$extension = "mp3";
$mime_type = "audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3";

if(file_exists($file)){
    header('Content-type: {$mime_type}');
    header('Content-length: ' . filesize($file));
    header('Content-Disposition: filename="' . $filename);
    header('X-Pad: avoid browser bug');
    header('Cache-Control: no-cache');
    readfile($file);
}else{
    header("HTTP/1.0 404 Not Found");
}

相关文章