MediaElementAudioSource因CORS访问限制而输出零

时间:2015-08-08 15:34:54

标签: web-audio

我尝试从元素音频获取频率,src是一个网址

var aud = document.getElementById("audio-player"); 
var canvas, ctx, source, context, analyser, fbc_array;
function initMp3Player(){
try {
  context = new (window.AudioContext || window.webkitAudioContext)();
} catch(e) {
    throw new Error('The Web Audio API is unavailable');
}

analyser = context.createAnalyser(); // AnalyserNode method
analyser.smoothingTimeConstant = 0.6;
analyser.fftSize = 512;
canvas = document.getElementById('canvas_up');

ctx = canvas.getContext('2d');

source = context.createMediaElementSource(aud); 

source.crossOrigin = 'anonymous';
source.connect(analyser);
analyser.connect(context.destination);
frameLooper();
}

function frameLooper(){
window.requestAnimationFrame(frameLooper);
fbc_array = new Uint8Array(analyser.frequencyBinCount);
analyser.getByteFrequencyData(fbc_array);
console.log(fbc_array);

var gradient = ctx.createLinearGradient(0,0,0,300);
gradient.addColorStop(1,'#000000');
gradient.addColorStop(0.65,'#000000');
gradient.addColorStop(0.55,'#FF0000');
gradient.addColorStop(0.25,'#FFCC00');
gradient.addColorStop(0,'#ffffff');

if(fbc_array != null){
  ctx.clearRect(0, 0, canvas.width, canvas.height);
}

ctx.fillStyle = gradient; // Color of the bars
for (var i = 0; i < (fbc_array.length); i++ ){
  var value = -(fbc_array[i]/4);
  ctx.fillRect(i*5,canvas.height,4,value*2);
}
}
window.addEventListener("load", initMp3Player, false);

和HTML:

<audio id="audio-player"><source src="" type="audio/mpeg"></audio>

但我收到错误: 由于CORS访问限制,MediaElementAudioSource输出零... 我搜索得非常多,但我收到了很好的答案和细节。我的英语不是很好,所以如果答案有演示就非常超级...谢谢

2 个答案:

答案 0 :(得分:0)

这是对的。如果未在媒体服务器上启用CORS(并发出相应的CORS请求),则无法从Web Audio中的其他域访问媒体。这是为了防止跨域信息攻击。

答案 1 :(得分:0)

我只是发现了这个问题,并对消息感到厌烦:MediaElementAudioSource由于的CORS访问限制而输出零。但这只是一个消息,我仍然可以听到音频。 我搜索了很多这方面的内容,认为此链接会有所帮助:http://www.codingforums.com/javascript-programming/342454-audio-api-js.html

  

createMediaElementSource方法应该创建一个使用MediaElementAudioSourceNode接口的对象。此类对象受基于Web Audio API规范的最新草案的跨源资源共享(CORS)限制的约束。 (请注意,此限制似乎不在规范的过时W3C版本中。)根据规范,当CORS限制阻止对资源的访问时,应该播放静默,这将解释“输出零”消息;据推测,零等于没有声音。

     

解除限制,页面所有者在   http://morebassradio.no-ip.org:8214/;stream/1需要配置   他们的服务器输出一个Access-Control-Allow-Origin标头   域名列表(包括您的域名)或提升它的*值   适用于所有域名。鉴于此流似乎已经存在   不受限制的,面向公众的内容,也许你可以说服业主   输出那个标题。您可以测试是否正在发送标头   在Firefox中按Ctrl + Shift + Q打开“网络”面板,加载   流通过地址栏,然后检查标题   与“网络”面板中的该HTTP请求相关联。

     

请注意,自音频流以来,它们不能使用元元素   显然,不是HTML文档;这种技术只适用于   HTML和XHTML文档。

     

(虽然您正在搞乱Firefox面板,但您可能需要确保   启用安全错误和警告(通过单击安全性   控制台面板中的按钮或其箭头(Ctrl + Shift + K)。我不确定   如果在Firefox中有相应的CORS消息,就像在Chrome中一样,但是   可能有。我浪费了很多时间,想知道为什么页面不是   在对类似技术进行故障排除的同时工作一天   安全策略(CSP),才发现我有相关的Firefox   消息隐藏。)

     

您不应该弄乱crossorigin属性/属性   除非你设置crossorigin =“use-credentials”(JavaScript)或   crossorigin =“use-credentials”(HTML)某处,但你可能   没有这样做,因为HTML规范的那部分尚未最终确定,   它几乎肯定会导致你的内容在之后“破解”   这样做,因为那时需要凭证。

     

我不熟悉Web Audio API,所以我无法想象   如何输出MediaElementAudioSourceNode并触发错误   我自己排除故障的消息。如果我使用createMediaElementSource   使用HTMLMediaElement(HTMLAudioElement),结果似乎不对   基于使用的测试成为MediaElementAudioSourceNode   instanceof运算符,即使规范说它应该是我的   读得对。

然后在我的情况下,我得到HTTP响应标题:

HTTP/1.1 206 Partial Content
Date: Thu, 02 Jun 2016 06:50:43 GMT
Content-Type: audio/mpeg
Accept-Ranges: bytes
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: X-Log, X-Reqid
Access-Control-Max-Age: 2592000
Content-Disposition: inline; filename="653ab5685893b4bf.mp3"
Content-Transfer-Encoding: binary
Last-Modified: Mon, 16 May 2016 02:00:05 GMT
Server: nginx
Cache-Control: public, max-age=31536000
ETag: "FpGQqtcf_s2Ce8W_4Mv6ZqSVkVTK"
X-Log: mc.g;IO:2/304
X-Reqid: 71cAAFQgUBiJMVQU
X-Qiniu-Zone: 0
Content-Range: bytes 0-1219327/1219328
Content-Length: 1219328
Age: 1
X-Via: 1.1 xinxiazai211:88 (Cdn Cache Server V2.0), 1.1 hn13:8 (Cdn Cache Server V2.0)
Connection: keep-alive

请注意“Access-Control-Allow-Origin:*”,我认为这是正确的,但我仍然得到消息。希望对你有所帮助。