2017-05-09 1 views
1

응용 프로그램에 미리 녹음 된 오디오 파일의 오디오 버퍼가 있습니다.웹 오디오 전체 버퍼 분석

getAudioDataFromBuffer: function(buf){ 
    var src = g.audioContext.createBufferSource(); 
    src.buffer = buf; 
    var anal = src.context.createAnalyser(); 
    src.connect(anal); 
    var dataArray = new Uint8Array(buf.length); 
    anal.fftSize = 2048; 
    anal.getByteFrequencyData(dataArray); 
    return dataArray; 
}, 

그러나 이것은 단지 나에게 제로의 전체 배열을 제공합니다 나는 전체 오디오 트랙의 주파수 도메인 데이터를 얻기 위해 노력하고있어 이것은 내가 무엇을 시도했다입니다.

두 개의 오디오 트랙을 비교하려면 하나가 미리 녹음되어 있고 다른 하나는 응용 프로그램에 녹음되어 있어야합니다. 나는 그들의 주파수 도메인 사이의 상관 관계를 측정 할 수 있다고 생각하고있다.

+2

그냥 참고 : "분석"단축하지 않습니다 : D – NoOorZ24

+0

어떻게 채널 데이터로부터 주파수 영역 데이터를받을 수 있나요? 채널 데이터 간의 상관 관계를 직접 측정했지만 결과가 마음에 들지 않았습니다. @Kaiido –

+0

@ NoOorZ24 그런 경우라면, 변수 이름으로'dic'을 보지 않거나 C++에서'std' 라이브러리 전체를 보지 못할 것입니다. – Matthias

답변

0

나는 당신이 (첫 번째 채널을 나타내는 0)

AudioBuffer.getChannelData()

채널 매개 변수에 의해 정의 된 채널과 연결된 PCM 데이터를 포함하는 Float32Array를 돌려 같은 뭔가 더 필요하다고 생각.

Mozilla 또는 W3C 설명서를 참조하십시오.

건배

킬리안

0

나는 this answerthis discussion을보고 솔루션에 도착했다.

기본적으로 OfflineAudioContext를 사용해야합니다. 여기 코드는 이미로드 오디오 버퍼에서 쳐다보고 :

var offline = new OfflineAudioContext(2, buffer.length ,44100); 
var bufferSource = offline.createBufferSource(); 
bufferSource.buffer = buffer; 

var analyser = offline.createAnalyser(); 
var scp = offline.createScriptProcessor(256, 0, 1); 

bufferSource.connect(analyser); 
scp.connect(offline.destination); // this is necessary for the script processor to start 

var freqData = new Uint8Array(analyser.frequencyBinCount); 
scp.onaudioprocess = function(){ 
    analyser.getByteFrequencyData(freqData); 
    console.log(freqData); 
}; 

bufferSource.start(0); 
offline.oncomplete = function(e){ 
    console.log('analysed'); 
}; 
offline.startRendering();