我有一个在 Glassfish 上运行的 Web 应用程序。该应用程序是使用 Java 使用 Servlet 编写的。
该应用程序允许您上传文件并获得该文件的直接链接。
由于某种原因,Safari 和 Chrome(可能是其他浏览器)在播放上传到此应用程序的 MP3 文件(和其他音频/视频文件)时会出现问题。
上传 MP3 的示例:http://uploads.graalcenter.org/upload/test.mp3
有时,Safari 会加载文件并正确播放,但大多数时候它要么永远停留在“正在加载...”,要么开始播放几秒钟然后停止下载。
我的浏览器正在发送这些请求 header :
GET http://uploads.graalcenter.org/upload/test.mp3 HTTP/1.1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7) AppleWebKit/535.1+ (KHTML, like Gecko) Version/5.1 Safari/534.48.3 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Referer: http://uploads.graalcenter.org/info/test.mp3 Cache-Control: max-age=0
我的服务器正在响应这些响应 header :
HTTP/1.1 200 OK Date: Sun, 31 Jul 2011 02:02:03 GMT X-Powered-By: Servlet/3.0 JSP/2.2 (GlassFish Server Open Source Edition 3.2-b06 Java/Sun Microsystems Inc./1.6) Content-Length: 1137602 Server: GlassFish Server Open Source Edition 3.2-b06 Content-Type: audio/mpeg Accept-Ranges: none
为了比较,我已将相同的文件上传到 Apache 服务器 here .
服务器用这些 header 响应:
HTTP/1.1 200 OK Date: Sun, 31 Jul 2011 02:06:56 GMT Connection: Keep-Alive Content-Length: 1137602 Last-Modified: Sun, 31 Jul 2011 02:05:57 GMT Server: Apache Etag: "1aa08001-115bc2-4a953f48b6b40" Content-Type: audio/mpeg Accept-Ranges: bytes Keep-Alive: timeout=2, max=100
文件正确播放。
我能看到的唯一区别是我的应用程序不接受范围请求,但这应该不会导致任何问题,不是吗?
如果我通过 curl 从我的 Web 应用程序下载 MP3,它具有相同的 MD5 哈希值,因此它不会以任何方式损坏 MP3。
有谁知道可能导致 MP3 无法正常播放的原因吗?
最佳答案
问题似乎出在处理音频的插件 AppleCoreMedia 在不使用范围数据时无法正常工作。我不会把它归咎于 Apple,因为我完全有可能犯了一些错误,但我最终实现了 HTTP Range header ,现在它每次都能正常工作。
关于http - 为什么 Chrome 或 Safari 不能正确播放我的 MP3?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6887115/