4

我正在尝试使用 HTML5 音频播放 mp3 广播流广播电台。

我认为这无关紧要,但无论如何这里是代码:

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 检查从广播服务器发送的内容,它清楚地说明了“内容类型:音频/mpeg”。有什么方法可以强制 Firefox 播放带有 HTML5 音频的直播流?

4

1 回答 1

3

去年,Adobe Flash Player 对 Shoutcast 的支持已中断两次(请参阅此处此处),因此这对我来说是一个非常重要的问题。

我决定调查一下。

Shoutcast 没有使用标准的 HTTP,而是使用 ICY 协议,这与 HTTP/1.0 大致相同。

Shoutcast 发送的状态行是

ICY 200 OK

但 Mozilla 不理解此状态行的 ICY 部分,因此它假定响应是 HTTP/0.9(没有内容类型/标头)。这样做的结果是流的主体包括 ICY 状态行和标头(即标头被 Mozilla 解析)。因为没有内容类型,Mozilla 做了一些“媒体嗅探”,并在内容的小偏移处发现有效的 MP3 帧,并且<audio>标签使用这种嗅探的内容类型正确运行。

现在出现了一个问题,该问题通过将所有通过非标准端口(即非端口 80/443)的 HTTP/0.9 内容强制为text/plain. 现在,当内容主体被传递给 HTML<audio>标记时,它的内容类型已经是text/plain,因此它不再像在此问题之前那样被嗅探,而是 Mozilla 不允许播放它。

好消息是我修复了这个烦恼,Mozilla 现在将 ICY 协议视为等同于 HTTP/1.0。这反过来意味着 Mozilla 可以解码标题并读取正确的内容类型audio/mpeg并恢复播放。

我的修复应该会在今年晚些时候进入 Mozilla24。

同时,如果你想在 Mozilla 中播放 Shoutcast,你需要通过 80 端口进行广播。

于 2013-07-12T14:39:24.537 回答