【发布时间】:2014-02-27 14:28:29
【问题描述】:
我有一个 PHP 脚本充当用户和 MP3 之间的代理。这是为了防止外部嵌入或盗链,因此我可以计算每个 MP3 文件的播放次数。
我在 Google Chrome 和 Safari(Opera、Firefox 和 Internet Explorer 完美运行)中遇到问题,它可以很好地播放 MP3,我也可以搜索,但次数有限。在搜索了几次后,播放器会自行变灰(原生 chrome 播放器)或显示错误(audio.js 和 JWPlayer 6)。我可以再次按播放,它会重新启动,但在出现此类错误后,audio.js 不会再次显示播放按钮。
JWPlayer 在控制台中抛出这个错误:
MediaError
code: 2
__proto__: MediaError
MEDIA_ERR_ABORTED: 1
MEDIA_ERR_DECODE: 3
MEDIA_ERR_ENCRYPTED: 5
MEDIA_ERR_NETWORK: 2
MEDIA_ERR_SRC_NOT_SUPPORTED: 4
在 chromes 原生播放器中,控制台报告“加载资源失败”,我的服务器错误日志显示没有错误。
我目前使用的代码来自 Los Cherone 的回答: Make mp3 seekable PHP
我之前的解决方案是这段代码我不再使用了,但在这里供参考:
<?php
$track = '/public_html/mp3-previews/' . $_GET['stream'];
if(file_exists($track)) {
header('Content-type: audio/mpeg');
header('Accept-Ranges: bytes');
header('Content-length: ' . filesize($track));
print file_get_contents($track);
} else {
echo "no file";
}
?>
这两个代码都会导致此错误,但值得指出的是,这两个代码都流式传输音频,并且它们都允许我搜索几次。
我最初的想法是函数 apache_request_headers 导致了问题,因为我运行的是 PHP 5.3,而我的主机正在运行 PHP 作为 Fast CGI。所以对于 Los Cherone 的代码,我使用的是 workaround,但为什么我的第一次尝试也不起作用?
编辑:这不是问题。我已经更新了我的 PHP 版本,这仍然是我的问题。
这是我的托管服务器示例: http://tabbidesign.com/audio/
Los Cherone 的代码和我自己的本地 Apache 服务器与 PHP 5.4.9 的组合完美运行,不会出现此问题。示例如下:http://tabbicat.info/proving/audio/
这可能是什么原因造成的?
【问题讨论】:
-
您的代码说它可以接受字节范围,但实际上完全无法提供字节范围...应该是
Accept-ranges: none -
在您欺骗音频标签要求子文件范围后,不要加载和提供整个文件。
-
@dandavis 原来你是完全正确的,我用 Fiddler 看看发生了什么,我得到 Content-Length 不匹配。您能否提供有关代码错误位置的任何指示。我已经完成了它并研究了这些功能,但据我所知,它只是发送请求的字节,除非没有请求范围。我需要 MP3 是可搜索的。谢谢!
-
我注意到的一件事是您的 Content-Length 标头始终表示完整的文件大小,而不是响应的实际长度。我知道有效的节点服务器也会发出“Connection:keep-alive”,不确定哪个重要。
标签: javascript php google-chrome safari webkit