2015-01-30 3 views
7

audioContext에서 가져 오는 샘플 속도를 다운 샘플링하려고합니다. 나는 그것이 44100에오고 있다고 믿고, 나는 그것을 11025가되기를 원한다. 나는 매 3 개의 샘플을 평균 할 수 있다고 생각하고 정확한 비율로 재생하지만 피치는 너무 높다. 마치 우리가 모두 헬륨 .자바 스크립트에서 PCM 오디오 버퍼 다운 샘플링

float32Array를 44100에서 11016 샘플의 int16Array로 다운 샘플링하는 올바른 방법은 무엇입니까?

var context = new Flash.audioContext(); 
var audioInput = context.createMediaStreamSource(stream); 
var recorder = context.createScriptProcessor(null, 1, 1); 
recorder.onaudioprocess = onAudio; 
audioInput.connect(recorder); 
recorder.connect(context.destination); 

var onAudio = function (e) { 
    var left = e.inputBuffer.getChannelData(0); 
    bStream.write(Flash.convertFloat32ToInt16(left)); 
} 

var convertFloat32ToInt16 = function(buffer) { 
    var l = buffer.length; 
    var point = Math.floor(l/3); 
    var buf = new Int16Array(point); 
    for (var x = l; x > 0;) { 
     var average = (buffer[x] + buffer[x-1] + buffer[x-2])/3; 
     buf[point] = average*0x7FFF; 
     point -= 1; 
     x -= 3; 
    } 
    return buf.buffer; 
} 

답변

10

답변이 필요한 모든 사용자를위한 것입니다. 또한 float32 대신 int16Array로 변환하면서

var downsampleBuffer = function (buffer, sampleRate, outSampleRate) { 
    if (outSampleRate == sampleRate) { 
     return buffer; 
    } 
    if (outSampleRate > sampleRate) { 
     throw "downsampling rate show be smaller than original sample rate"; 
    } 
    var sampleRateRatio = sampleRate/outSampleRate; 
    var newLength = Math.round(buffer.length/sampleRateRatio); 
    var result = new Int16Array(newLength); 
    var offsetResult = 0; 
    var offsetBuffer = 0; 
    while (offsetResult < result.length) { 
     var nextOffsetBuffer = Math.round((offsetResult + 1) * sampleRateRatio); 
     var accum = 0, count = 0; 
     for (var i = offsetBuffer; i < nextOffsetBuffer && i < buffer.length; i++) { 
      accum += buffer[i]; 
      count++; 
     } 

     result[offsetResult] = Math.min(1, accum/count)*0x7FFF; 
     offsetResult++; 
     offsetBuffer = nextOffsetBuffer; 
    } 
    return result.buffer; 
} 

는 전달 된 하나 이상의 샘플 레이트 작은 반환한다.

+0

이 게시물에 대한 하나님 감사합니다. 너 정말 잘 모르겠다. –

+0

그것은 누군가를 도울 수있어서 기뻤습니다 :) 그것은 해결할 난장판이었습니다. – Neablis

+0

당신은 내 하루를 저장합니다 : 'D – diewland

관련 문제