首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用recorderWorker.js和recorder.js录制声音

用recorderWorker.js和recorder.js录制声音
EN

Stack Overflow用户
提问于 2014-01-21 23:46:44
回答 1查看 2.6K关注 0票数 1

我正在使用recorderWorker.js和recorder.js,我从这个代码得到的最终输出是44.1 8khz,2声道(立体声) wav file.But我的要求是8 8khz,1声道wav文件。如何在recorderWorker.js的帮助下实现这一点?

请帮助我解决这个问题。

recorderWorker.js的代码是

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

发布于 2016-01-08 22:08:14

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

代码语言:javascript
复制
var audioContext = new AudioContext();
var microphone = audioContext.createMediaStreamSource(stream);
recorder = new Recorder(microphone, { numChannels: 1, sampleRate: 8000 });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21262788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档