为什么我将 MediaElement Source 添加到音乐后没有声音?网络音频 API

why no sound after I add MediaElement Source to the music? Web Audio API

我正在尝试使用网络音频 API,因为我希望根据正在播放的音乐制作一些可视化效果。但是我发现的所有示例,就像音频被静音一样。它播放文件,但没有声音。

我知道它需要 CORS,我尝试通过添加 "audio.crossOrigin = 'anonymous'" 来修复。但它不起作用。提前致谢。

这是 link 代码笔:http://codepen.io/lianliu/pen/xwPXvO/?editors=101

$(document).ready(function() {
var audio = new Audio("http://w-labs.at/experiments/audioviz/GYAKO.mp3");
audio.crossOrigin = "anonymous";
var audioCtx = new(window.AudioContext || window.webkitAudioContext)();
//var audioElement = document.getElementById('myAudio');
var audioSrc = audioCtx.createMediaElementSource(audio);
var analyser = audioCtx.createAnalyser();
// Bind our analyser to the media element source.
audioSrc.connect(analyser);
audioSrc.connect(audioCtx.destination);
audio.play();
audio.volume = 0.5;

//var frequencyData = new Uint8Array(analyser.frequencyBinCount);
var frequencyData = new Uint8Array(200);

var svgHeight = '300';
var svgWidth = '1200';
var barPadding = '1';

function createSvg(parent, height, width) {
    return d3.select(parent).append('svg').attr('height', height).attr('width', width);
}

var svg = createSvg('body', svgHeight, svgWidth);

// Create our initial D3 chart.
svg.selectAll('rect')
    .data(frequencyData)
    .enter()
    .append('rect')
    .attr('x', function(d, i) {
        return i * (svgWidth / frequencyData.length);
    })
    .attr('width', svgWidth / frequencyData.length - barPadding);

// Continuously loop and update chart with frequency data.
function renderChart() {
    requestAnimationFrame(renderChart);

    // Copy frequency data to frequencyData array.
    analyser.getByteFrequencyData(frequencyData);

    // Update d3 chart with new data.
    svg.selectAll('rect')
        .data(frequencyData)
        .attr('y', function(d) {
            return svgHeight - d;
        })
        .attr('height', function(d) {
            return d;
        })
        .attr('fill', function(d) {
            return 'rgb(0, 0, ' + d + ')';
        });
}

// Run the loop
renderChart();

});

I know that it entails CORS, and I tried to fix by adding "audio.crossOrigin = 'anonymous'". But it doesn't work.

你走在正确的轨道上。您需要确保您的服务器使用 Access-Control-Allow-Origin header 集提供 mp3。将其设置为您发出请求的特定域,或设置为“*”以从任何地方访问它。

如何设置 header 取决于您使用的服务器软件 运行。以下是不同方法的列表:http://enable-cors.org/server.html

编辑:

尝试将 URL 更改为与 header 组合一起提供的 mp3,例如

http://chrome-jam-static.commondatastorage.googleapis.com/sounds/soundlogo_jam.mp3

您会发现您的代码运行良好。