2

我正在使用 HTML5 音频元素开发一个基本的音频播放器。所有提供的文件都是 .ogg 通过 API 作为二进制字符串来自另一个系统,并由一个简单的 PHP 处理程序(包括一些基本的安全检查)打印出来,我真的无能为力。

然而,虽然一切都在 Firefox 上运行良好,但 Chrome 在查找、跳过或重播方面存在一些问题(简单地说:无法完成)。从音频元素获取音频持续时间返回 Infinity,虽然 currentTime 返回正确值,但无法对其进行操作。

我开始摆弄标题和响应代码,但似乎没有任何工作正常。对部分内容使用响应代码 206 或在标头中声明 Accept-Ranges 会导致音频元素像源文件不存在时那样被禁用。

搜索正确的标题并没有产生太多结果,因为它总是关于部分内容和 X-Content-Duration(由于 VBR,这是一个要计算的 PITA),这在 Chrome 上完全没有任何作用。

以下是在 FF 上运行良好的相关标题。我是在某些事情上犯了重大错误,还是 Chrome 有问题?

HTTP/1.1 200 OK (changing this to 206 makes the file unplayable in Chrome)
Cache-Control: public, no-store
Content-Disposition: attachment; filename="redacted.ogg"
Content-Length: 123456
X-Content-Duration: 12 (this does nothing on Chrome, works on FF)
Content-Range: bytes 0-123455/123456
Accept-Ranges: bytes (...as does including this)
Content-Transfer-Encoding: binary
Content-Type: audio/ogg
Expires: 0
Pragma: public

编辑: Opera 上的某种行为,可能在所有 Webkit 浏览器上。fread在/file_get_contents类型的情况下也不起作用。

4

1 回答 1

0

好吧,愚蠢的我,这确实是由于部分内容。Chrome 并不真正喜欢一次获取整个文件(并像 FF 一样缓存它)的想法,因此要启用查找和诸如此类的东西,它需要 Accept-Ranges: 字节,一些传入的标头解析以获取请求的字节范围和几行返回具有正确部分内容状态(206)的上述字节范围,而不仅仅是“字节0-(文件大小-1)/文件大小”(整个文件),即使第一个请求要求它(字节= 0- )。

希望这对其他人也有帮助。

于 2013-10-29T10:13:09.303 回答