Ogg音频来自PHP文件,在Chrome上无法访问

时间:2013-10-28 09:34:39

标签: php html5 google-chrome audio http-headers

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

然而,虽然一切都在Firefox上运行良好,但Chrome在搜索,跳过或重放方面存在一些问题(简单地说:它无法完成)。从audio元素获取音频持续时间会返回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类型的情况下也不起作用。

1 个答案:

答案 0 :(得分:0)

好吧,愚蠢的我,这真的是由于部分内容。 Chrome并不是真的喜欢同时获取整个文件的想法(并像FF一样缓存它),因此要启用搜索和其他需要的接受范围:字节,一些传入的头解析以获取所请求的字节范围和即使第一个请求要求它(字节= 0- )。

希望这也有助于其他人。