音频上下文在android上无法正常工作

时间:2016-04-22 14:22:46

标签: javascript android cordova html5-audio chromium

我遇到了android的这个问题(对于Android浏览器或者用于android的chrome):getByteFrequencyData方法返回0值。

有人说Android移动设备不支持Web Audio Api(IOS确实支持它)但是我已经检查了这个link,其中说Chrome 49支持Audio Api。

有人说这是一个旧issue

有人说这个问题来自媒体元素,如果你可以将XHR的媒体加载到缓冲区并播放它,它会work(我测试但它没有工作)< / p>

我试图通过使用Audio APi + Canvas制作一个使用android cordova的音频可视化工具 有帮助吗?

1 个答案:

答案 0 :(得分:1)

我得到它的工作,带有两个参数的createBuffer()方法不再适用于chrome版本,所以我不得不使用decodeAudioData来获取缓冲区源:

// Create AudioContext and buffer source
var audioCtx = new AudioContext();
source = audioCtx.createBufferSource();
// load in an audio track via XHR and decodeAudioData
function getData() {
request = new XMLHttpRequest();
request.open('GET', 'Test.mp3', true);
request.responseType = 'arraybuffer';
request.onload = function() {
var audioData = request.response;

audioCtx.decodeAudioData(audioData, function(buffer) {
myBuffer = buffer;   
source.buffer = myBuffer;

analyser = audioCtx.createAnalyser(); // AnalyserNode method
canvas = document.getElementById('CanvasDiv');
canvasContext = canvas.getContext('2d');
source.connect(analyser);
analyser.connect(audioCtx.destination);

frameLooper(); 
},
function(e){"Error with decoding audio data" + e.err});
}
request.send();
}
function frameLooper(){
ionic.requestAnimationFrame(frameLooper); //You can use window instead of ionic
fbc_array = new Uint8Array(analyser.frequencyBinCount);
analyser.getByteFrequencyData(fbc_array);
canvasContext.clearRect(0, 0, canvas.width, canvas.height); // Clear the canvas
canvasContext.fillStyle = '#00CCFF'; // Color of the bars
bars = 100;

for (var i = 0; i < bars; i++) {
    bar_x = i * 3;
    bar_width = 2;
    bar_height = -(fbc_array[i] / 2);
    //  fillRect( x, y, width, height ) // Explanation of the parameters below
    canvasContext.fillRect(bar_x, canvas.height, bar_width, bar_height);
}
}
getData();
var audio = document.getElementById('audioTagId');
Callback = function(){
        source.start();
    }
document.getElementById("PlayButton").addEventListener("click", Callback);