Firefox WebAudio createMediaElementSource无法正常工作

z33*_*33m 13 firefox html5 html5-audio web-audio-api

我使用WebAudio API将new Audio()对象作为源.以下是我正在做的简化版本.然而,这并没有在Firefox 25.0.1中播放任何声音.

var context;
if(window.webkitAudioContext) {
    context = new webkitAudioContext();
} else {
    context = new AudioContext();
}
var audio = new Audio();

// This file does seem to have CORS Header
audio.src = "http://upload.wikimedia.org/wikipedia/en/4/45/ACDC_-_Back_In_Black-sample.ogg";

var source;
function onCanPlay() {
    console.log("can play called");
    source = context.createMediaElementSource(audio);
    source.connect(context.destination);
    audio.removeEventListener("canplay", onCanPlay);
    audio.play();
}

if(audio.readyState < 3) {
    audio.addEventListener("canplay", onCanPlay);
} else {
    onCanPlay();
}
Run Code Online (Sandbox Code Playgroud)

jsFiddle:http://jsfiddle.net/7bJUU/

我读了另一个问题,createMediaElementSource需要CORS.上面的例子中的文件确实有,Access-Control-Allow-Origin: *但它仍然无法在Firefox中工作.如果我在本地使用本地音频文件运行相同的示例,一切正常.

不确定这是一个错误还是我做了一些非常错误的事情.任何帮助表示赞赏.

小智 5

原因如下:

  1. Firefox(截至 2015 年 10 月 7 日更新至 41.0.1 之前和之后测试)似乎在安全套接字 HTTP 上存在不安全跨域问题。我更新到 https: 在媒体源上,因为维基媒体有替代 443 TCP 和颁发给“维基媒体基金会”的有效证书。从 2015 年 6 月 23 日到 2017 年 2 月 19 日,来自 CA“GlobalSign”。在安全域中时,浏览器也用于要求安全资源。
  2. Audio DOM 元素和其他元素(如 Image 和 Video)具有属性“crossOrigin”,该属性指定是否提供凭据(cookie)。匿名跨域指定不会将域 cookie 交换到跨域,这被浏览器认为是安全的。因此,在指定音频源之前,我将“audio.crossOrigin”设置为“anonymous”。

我在 Firefox(如第一项所述)和 Chrome 45.0.2454.101m 上进行了测试,它们运行良好,因此我在 JSFiddle 上进行了更新:https ://jsfiddle.net/7bJUU/11/7bJUU