我正在尝试使用 HTML5 音频播放 mp3shoutcast 流广播电台。
我认为这不相关,但无论如何,这里是代码:
var player = new Audio();
player.autobuffer = true;
player.src = "http://173.192.48.71:9048/;";
player.volume = 1;
player.play();
Shoutcast 检测到请求来自浏览器并返回无线电状态页面,因此我输入“;”在流的末尾,强制服务器返回音频流而不是状态页面。这在 Chrome 和 Safari 中工作正常,但在 Firefox 中不行。
Firefox 由于某种原因将其检测为文本/纯内容并拒绝播放,并出现以下错误:
HTTP "Content-Type" of "text/plain" is not supported.
Load of media resource http://173.192.48.71:9048/; failed.
我使用 Fiddler 检查从shoutcast 服务器发送的内容,它明确指出“内容类型:音频/mpeg”。有没有办法强制 Firefox 播放带有 HTML5 音频的shoutcast 流?
Adobe Flash Player 对 Shoutcast 的支持已两次中断(请参阅here and here)在去年,所以这对我来说是一个非常重要的问题。
我决定调查一下。
Shoutcast 不使用标准 HTTP,而是使用 ICY 协议,该协议与 HTTP/1.0 大致相同。
Shoutcast 发送的状态行是
ICY 200 OK
但 Mozilla 不理解此状态行的 ICY 部分,因此它假设响应是 HTTP/0.9(没有内容类型/标头)。这样做的结果是流的主体包括 ICY 状态行和标头(即标头是not由 Mozilla 解析)。因为没有内容类型,所以 Mozilla 会进行一些“媒体嗅探”,并在内容和内容的较小偏移处发现有效的 MP3 帧。<audio>
使用此嗅探的内容类型,标签可以正确运行。
现在来了an issue通过强制所有来自非标准端口(即非端口 80/443)的 HTTP/0.9 内容的内容类型为text/plain
。现在,当内容正文传递到 HTML 时<audio>
标记它已经有一个内容类型text/plain
,因此不再像此问题之前那样嗅探它,而是 Mozilla 不允许播放它。
好消息是我解决了这个烦恼Mozilla 现在将 ICY 协议视为等同于 HTTP/1.0。这反过来意味着 Mozilla 可以解码标头并读取正确的内容类型audio/mpeg
并恢复播放。
我的修复应该会在今年晚些时候进入 Mozilla24。
同时,如果您想在 Mozilla 中播放 Shoutcast,则需要通过端口 80 进行广播。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)