2014-09-23 1 views
2

android chrome v.37의 웹 오디오 API를 통해 소리의 주파수 애니메이션에 문제가 있습니다. 음악을들을 수는 있지만 애니메이션이 없습니다.WebAudioApi, 주파수 사운드 애니메이션, android chrome v37

많은 실험을 통해 사운드를로드하고 애니메이션을 적용하는 마지막 두 가지 방법이 있습니다. 첫 번째 방법은 iduio html 5 요소를 통해 사운드를로드하는 것입니다. 그런 다음 audio 요소를 매개 변수로 사용하여 MediaElementSource를 만듭니다. MediaElementSource를 Analyzer (AudioContext.createAnalyser 요소)에 연결합니다. 분석 GainNode에 연결하고, 마지막으로 GainNode를 AudioContext.destination에 연결합니다.

코드 :

var acontext = new AudioContext(); 
var analyser = acontext.createAnalyser(); 
var gainNode = acontext.createGain(); 
var audio = new Audio(path_to_file); 
var source = acontext.createMediaElementSource(temp_audio); 
source.connect(analyser); 
analyser.connect(gainNode); 
gainNode.connect(acontext.destination); 

이 스키마 PC-크롬에 대한 작업과 최신 모바일 사파리. FireFox에서도 마찬가지입니다.

내가 발견 한 두 번째 방법은 몇 가지 차이점이 있습니다. 소리가 버퍼링되어 읽히고 분석기에 연결됩니다.

코드 : 그리기 애니메이션

var acontext = new AudioContext(); 
var analyser = acontext.createAnalyser(); 
var gainNode = acontext.createGain(); 
var source = acontext.createBufferSource(); 

var request = new XMLHttpRequest(); 
request.open('GET', path, true); 
request.responseType = 'arraybuffer'; 
request.addEventListener('load', function(){ source.buffer = acontext.createBuffer(request.response, false); }, false); 
request.send(); 

source.connect(analyser); 
analyser.connect(gainNode); 
gainNode.connect(acontext.destination); 

내가 무승부 캔버스, 데이터를 사용 : 기존의 Chromes, 모바일 브라우저, 사파리에

analyser.fftSize = 1024; 
analyser.smoothingTimeConstant = 0.92; 
var dataArray = new Uint8Array(analyser.frequencyBinCount); 
analyser.getByteFrequencyData(dataArray); //fill dataArray from analyser 

for (var i = 0; i < analyser.frequencyBinCount; i++) { 
    barHeight = dataArray[i]; 
    // and other logic here. 
} 

두 번째 방법으로 작동합니다.

하지만 안드로이드 크롬 v37에서 양방향 작동하지 않습니다. 첫 번째 방법으로 애니메이션을 표시하지 않기 전에 말했듯이 두 번째 것은 오류로 중단됩니다 - acontext.createBuffer()는 2 대신 3 개의 매개 변수를 요청합니다. 새로운 Web Audio Api 버전에서이 메서드는 최신 호출 유형으로 다시 작성되었습니다. , 다른 매개 변수와 함께, 그래서 그것을 사용하지 마십시오.

여기에서 Android 크롬 v.37을 강제 실행하는 방법에 대한 조언이 있으십니까?

답변

0

크로스 브라우저 솔루션을 발견했습니다.

acontext.decodeAudioData(request.response, function (buffer) { 
    source.buffer = buffer 
} 

이렇게하면 모든 브라우저에서 올바르게 작동합니다. 그러나 나는 오디오 태그를 거부하고 XmlHTTPRequest를 통해 사운드를로드합니다. decodeAudioData에서 디코딩을위한 오디오 요소로부터 버퍼를 얻는 방법을 알고 있다면 - 어떻게 코멘트 해주십시오.

관련 문제