2014-12-10 19 views
3

나는 RecorderJS를 사용하여 사용자로부터 마이크 스트림을 녹음하고 있습니다. 기본 내보내기는 44.1 kHz, 16 비트의 WAV 파일입니다. 어쨌든 11kHz 또는 16kHz로 이것을 다운 샘플링 할 수 있습니까? 어쨌든 16 비트 16khz WAV 파일을 웹 오디오 API getUserMedia 스트림에서 자바 스크립트 만 사용하여 얻을 수 있습니까?웹 오디오 API 다운 샘플 44.1khz (자바 스크립트)

나는 파일 크기를 줄이려고 노력 중이므로 사용자에게 많은 대역폭을 절약하고있다. 감사.

답변

1

편집 :이 올바른 방법 인 경우이 한 가지 더, 당신은 또한, 나는 확실하지 않다 대신 모두 하나의 채널 만 ...

을 보낼 수 있지만 데이터의 보간을 수행하여 한 , 마이크, 나는 당신이이 같은 마이크 뭔가에서 데이터를 캡처하는 추측하고 에서

this.node.onaudioprocess = function(e){ 
     if (!recording) return; 
     worker.postMessage({ 
      command: 'record', 
      buffer: [ 
       e.inputBuffer.getChannelData(0), 
       e.inputBuffer.getChannelData(1) 
       ] 
     }); 
    } 

을받은 지금

var oldSampleRate = 44100, newSampleRate = 16000; 
this.node.onaudioprocess = function(e){ 

    var leftData = e.inputBuffer.getChannelData(0); 
    var rightData = e.inputBuffer.getChannelData(1); 
    leftData = interpolateArray(leftData, leftData.length * (newSampleRate/oldSampleRate) ); 
    rightData = interpolateArray(rightData, rightData.length * (newSampleRate/oldSampleRate)); 
    if (!recording) return; 
    worker.postMessage({ 
     command: 'record', 
     buffer: [ 
       leftData, 
       rightData 
       ] 
    }); 
} 

function interpolateArray(data, fitCount) { 
    var linearInterpolate = function (before, after, atPoint) { 
     return before + (after - before) * atPoint; 
    }; 

    var newData = new Array(); 
    var springFactor = new Number((data.length - 1)/(fitCount - 1)); 
    newData[0] = data[0]; // for new allocation 
    for (var i = 1; i < fitCount - 1; i++) { 
     var tmp = i * springFactor; 
     var before = new Number(Math.floor(tmp)).toFixed(); 
     var after = new Number(Math.ceil(tmp)).toFixed(); 
     var atPoint = tmp - before; 
     newData[i] = linearInterpolate(data[before], data[after], atPoint); 
    } 
    newData[fitCount - 1] = data[data.length - 1]; // for new allocation 
    return newData; 
}; 
으로 수정