http - 为什么 Chrome 或 Safari 不能正确播放我的 MP3?

标签 http servlets audio webkit http-headers

我有一个在 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/

相关文章:

java - 从 Servlet 获取复选框值

java - 自动生成的邮件

audio - 使用Mp3Wrap合并两个mp3

objective-c - 判断音频文件是否为VBR

c# - C# 中的音频捕获

php - 检查页面是否在 PHP 中使用 SSL

c# - 如何在 C# 中将 HTTP Last-Modified header 从 UTC 解析为 DateTime

java - 使用HttpPost提交表单登录后读取URL的HttpResponse

javascript - Websockets 客户端 API 中的 HTTP header

tomcat - 我应该在进行后处理之前刷新过滤器中的响应以改善延迟吗?