1

在我的 HTML5 测试文件中,我可以播放和重新播放 mp3 声音文件,如果:

  1. 我的文件在本地托管,或者
  2. 它们托管在传统的网络主机上(参见http://sgdk2.enigmadream.com/ben/iotaBuildIt/sound.html)或
  3. 我从 Internet Explorer 播放

如果出现以下情况,我可以第一次播放声音,但不能第二次播放:

  1. 这些文件托管在 Mercurial 存储库中,并且
  2. 我正在使用 Chrome 访问文件

(使用 IE 访问 Mercurial 托管的文件时我没有遇到问题。)

在这些情况下,我无法在以下情况下重新播放文件:

  1. 通过 HTML 页面(http://hg.code.sf.net/u/bluemonkmn/myiota/raw-file/97ac02a717fe/HTML/sound.html)访问它 我不能让脚本重播它和 b。我无法使用音频控制 UI 重播它。也不
  2. 直接访问文件(http://hg.code.sf.net/u/bluemonkmn/myiota/raw-file/97ac02a717fe/HTML/bing.mp3

有人可以解释或帮助我修复它,以便 Chrome 可以像 IE 一样重新播放 Mercurial 中托管的音频文件吗?此外,我还没有测试过 FireFox,并且很想知道它在那里是如何工作的。

4

2 回答 2

2

如果我不得不猜测,我会说区别在于 Apache 静态文件服务和 hgweb 提供的标头。这是来自 Apache 的静态文件服务的 .mp3 文件的输出:

$ HEAD -Ssed http://sgdk2.enigmadream.com/ben/iotaBuildIt/bing.mp3
HEAD http://sgdk2.enigmadream.com/ben/iotaBuildIt/bing.mp3
200 OK
Connection: close
Date: Wed, 23 May 2012 16:55:03 GMT
Accept-Ranges: bytes
ETag: "4d0cbbe-16c7-4bd83a906c040"
Server: Apache
Content-Length: 5831
Content-Type: audio/mpeg
Last-Modified: Thu, 12 Apr 2012 23:24:41 GMT

这里它来自 hgweb 的原始文件处理程序:

HEAD http://hg.code.sf.net/u/bluemonkmn/myiota/raw-file/97ac02a717fe/HTML/bing.mp3
200 Script output follows
Connection: close
Date: Wed, 23 May 2012 16:56:33 GMT
Server: Apache/2.2.3 (CentOS)
Content-Length: 5831
Content-Type: audio/mpeg
Content-Disposition: inline; filename="bing.mp3"

最大的区别在于 Apache 包含Accept-Ranges标头,而 hgweb 提供了Content-Disposition标头。

此处的Content-Disposition标题仅向您的浏览器建议 saveAs 的默认文件名,因此它不太可能是罪魁祸首(但人们永远不知道)。

标题Accept-Ranges更有趣。虽然它不是最初的目的,但它已成为寻求流式音频和视频播放的支柱。如果人们再次将播放视为寻找(寻找为零)的一种特殊情况,那么 Chrome 可能正在禁用它,因为没有Accept-Ranges标题它认为它根本无法寻找(当然,寻找零只是在播放再次从零开始)。

这绝对只是吐痰,但它很容易测试。调整 hgweb 的 apache 主机以使用mod_headers,如下所示:

header add Accept-Ranges bytes

在运行您的路径中hgweb(无论是 wsgi 还是 cgi)。当您使用它时,您也可以删除Content-Disposition标题mod_headers

最后,这一切都与线路上的字节有关。您可以让 hgweb 和 Apache 返回完全相同的字节,然后 Chrome以相同的方式处理它。

注意:当然,将Accept-Ranges: bytes标头添加到 hgweb 的输出实际上并没有为 hgweb 添加字节范围支持,但这没关系。hgweb 只会忽略Range: bytes=xxxx标头,而不是给出206 Partial Response状态,它会给出 a200 OK并且 RFC 说需要客户端(Chrome)来处理它。因此,您将无法跳过文件,但 Chrome 可能足以让您搜索开始/重播。

于 2012-05-23T17:10:48.803 回答
1

我已经报告了Chromium 错误 #129165,怀疑这是一个错误,因为它显然可以在工作 Linux 下工作。

于 2012-05-22T13:53:25.367 回答