2014-01-21 68 views
1

我正在使用recorderWorker.js和recorder.js 我从此代码获得的最终输出是44.1khz,2声道(立体声)wav文件。但我的要求是8khz,1个频道的wav文件。 我如何在记录器的帮助下实现这个工作.js使用recorderWorker.js和recorder.js录制声音

请帮我解决这个问题。

为recorderWorker.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

你并不需要修改Recorder.JS库 - 已经提供了这个功能。构造函数接受配置对象作为第二个参数,如下所示:

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