2014-01-21 2 views
1

나는 recorderWorker.js와 recorder.js를 사용하고 있습니다. 이 코드에서 얻은 최종 출력은 44.1khz, 2 채널 (스테레오) wav 파일입니다.하지만 제 요구 사항은 다음과 같습니다. 8khz, 1 채널 wav 파일 어떻게 이것을 recorderWorker.js의 도움으로 얻을 수 있습니까?recorderWorker.js와 recorder.js로 사운드 녹음하기

문제를 해결하는 데 도움을주십시오.

recorderWorker.js의 코드는 당신은 Recorder.JS 라이브러리를 수정할 필요가 없습니다

var recLength = 0, 
recBuffers = [], 
    sampleRate; 
this.onmessage = function(e){ 
    switch(e.data.command){ 
case 'init': 
    init(e.data.config); 
    break; 
case 'record': 
    record(e.data.buffer); 
    break; 
case 'exportWAV': 
    exportWAV(e.data.type); 
    break; 
case 'getBuffer': 
    getBuffer(); 
    break; 
case 'clear': 
    clear(); 
    break; 
    } 
}; 

function init(config){ 
    sampleRate = config.sampleRate; 
} 

function record(inputBuffer){ 
    var bufferL = inputBuffer[0]; 
    var bufferR = inputBuffer[1]; 
    var interleaved = interleave(bufferL, bufferR); 
    recBuffers.push(interleaved); 
    recLength += interleaved.length; 
} 

function exportWAV(type){ 
    var buffer = mergeBuffers(recBuffers, recLength); 
    var dataview = encodeWAV(buffer); 
    var audioBlob = new Blob([dataview], { type: type }); 
    this.postMessage(audioBlob); 
} 

function getBuffer() { 
    var buffer = mergeBuffers(recBuffers, recLength) 
    this.postMessage(buffer); 
    } 

function clear(){ 
    recLength = 0; 
    recBuffers = []; 
} 

function mergeBuffers(recBuffers, recLength){ 
    var result = new Float32Array(recLength); 
    var offset = 0; 
    for (var i = 0; i < recBuffers.length; i++){ 
    result.set(recBuffers[i], offset); 
    offset += recBuffers[i].length; 
    } 
    return result; 
} 
function interleave(inputL, inputR){ 
    var length = inputL.length + inputR.length; 
    var result = new Float32Array(length); 

    var index = 0, 
    inputIndex = 0; 

    while (index < length){ 
    result[index++] = inputL[inputIndex]; 
    result[index++] = inputR[inputIndex]; 
    inputIndex++; 
    } 
    return result; 
} 

function floatTo16BitPCM(output, offset, input){ 
    for (var i = 0; i < input.length; i++, offset+=2){ 
    var s = Math.max(-1, Math.min(1, input[i])); 
    output.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true); 
    } 
} 

    function writeString(view, offset, string){ 
    for (var i = 0; i < string.length; i++){ 
    view.setUint8(offset + i, string.charCodeAt(i)); 
    } 
} 

function encodeWAV(samples){ 
    var buffer = new ArrayBuffer(44 + samples.length * 2); 
    var view = new DataView(buffer); 

    /* RIFF identifier */ 
    writeString(view, 0, 'RIFF'); 
    /* file length */ 
    view.setUint32(4, 32 + samples.length * 2, true); 
    /* RIFF type */ 
    writeString(view, 8, 'WAVE'); 
    /* format chunk identifier */ 
    writeString(view, 12, 'fmt '); 
    /* format chunk length */ 
    view.setUint32(16, 16, true); 
    /* sample format (raw) */ 
    view.setUint16(20, 1, true); 
    /* channel count */ 
    view.setUint16(22, 2, true); 
/* sample rate */ 
    view.setUint32(24, sampleRate, true); 
    /* byte rate (sample rate * block align) */ 
    view.setUint32(28, sampleRate * 4, true); 
    /* block align (channel count * bytes per sample) */ 
    view.setUint16(32, 4, true); 
/* bits per sample */ 
    view.setUint16(34, 16, true); 
    /* data chunk identifier */ 
    writeString(view, 36, 'data'); 
    /* data chunk length */ 
    view.setUint32(40, samples.length * 2, true); 

    floatTo16BitPCM(view, 44, samples); 

     return view; 
} 

답변

0

입니다 -이 기능이 이미 제공됩니다. 생성자는 두 번째 매개 변수로 config 객체를 다음과 같이 허용합니다.

var audioContext = new AudioContext(); 
var microphone = audioContext.createMediaStreamSource(stream); 
recorder = new Recorder(microphone, { numChannels: 1, sampleRate: 8000 }); 
관련 문제