javascript - HTML5 音频录制太大

标签 javascript html audio

我成功地使用 HTML5 创建了一个完整的录音机。 我的问题是创建的WAV 文件的大小,它太大,无法发送到我的服务器。我正在使用许多用户似乎正在使用的 exportWAV 功能。 此函数从音频 BLOB 创建一个 WAV 文件:

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

  writeString(view, 0, 'RIFF');
  view.setUint32(4, 32 + samples.length * 2, true);
  writeString(view, 8, 'WAVE');
  writeString(view, 12, 'fmt ');
  view.setUint32(16, 16, true);
  view.setUint16(20, 1, true);
  view.setUint16(22, 1, true);
  view.setUint32(24, sampleRate, true);
  view.setUint32(28, sampleRate * 4, true);
  view.setUint16(32, 4, true);
  view.setUint16(34, 16, true);
  writeString(view, 36, 'data');
  view.setUint32(40, samples.length * 2, true);
  floatTo16BitPCM(view, 44, samples);

  return view;
}

我正在浏览各种替代方案,但没有一个真正足够或足够简单:

  • 压缩文件 - 效果不佳并且存在一些安全问题。
  • 转换为 MP3 - 使过程变得更加缓慢和复杂,还存在安全问题,并导致声音质量下降很多。

我的问题是 - HTML5 getUserMedia 是否仅导出到 .WAV 文件? 如果有一个函数,例如我使用的 encodeWAV,即 encodeMP3 - 那将是完美

解决此类问题的推荐方法是什么?

如果可能的话,我很想得到一个简单的工作示例。

谢谢。

最佳答案

推荐的方法可能是使用 API already there in your browser而不是用我们现有的糟糕工具自己重写它。

因此,要录制音频流,(https fiddle for chrome)

// get our audio stream
navigator.mediaDevices.getUserMedia({
  audio: true
}).then(setup);

function startRecording(stream) {
  let recorder = new MediaRecorder(stream);
  let chunks = []; // here we'll store all recorded chunks
  // every time a new chunk is available, store it
  recorder.ondataavailable = (e) => chunks.push(e.data);
  recorder.onstop = () => {
    let blob = new Blob(chunks);
    saveRecordedAudio(blob);
  };
  recorder.start();
  return recorder;
}

function saveRecordedAudio(blob) {
  // do whatever with this audio file e.g:
  // var form = new FormData();
  // form.append('file', blob, 'myaudio.ogg');
  // xhr.send(form)

  // for demo here, we'll just append a new audio with the recorded audio
  var url = URL.createObjectURL(blob);
  var a = new Audio(url);
  a.controls = true;
  document.body.appendChild(a);
  a.onload = () => URL.revokeObjectURL(url);// better to always revoke blobURLs...
}

function setup(stream) {
  let btn = document.querySelector('button');
  let recording = false;
  var recorder; // weird bug in FF when using let...
  btn.onclick = (e) => {
    if (recording = !recording) {
      recorder = startRecording(stream);
    } else {
      recorder.stop();
    }
    e.target.textContent = (recording ? 'stop' : 'start') + ' recording';
  };
}
<button>start recording</button>

这会将您的流录制为 OPUS/ogg,如果您想要 wav,只需 do the conversion server side .

关于javascript - HTML5 音频录制太大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41918946/

相关文章:

javascript - 使用 settimeout 绕过地理编码查询限制

audio - 将 5.1 视频缩混为立体声的更快方法?

javascript - 我应该使用 Table.cells[] 吗?

javascript不调用php变量

iphone - iPhone应用程序拒绝我自己的头文件类中的audioPlayerDidFinishPlaying

ios - 如何创建 iOS 安全音频播放器

javascript - 从单击它的 html 表的行中预填充表单字段。(所有这一切都应该发生在 jsp 上)

php - 根据环境在 Javascript 中设置新的资源绝对路径

javascript - 如何从 angularjs 的下拉列表中检索值

javascript - ANDROID WEBKIT : Select elements getting focus events, 但打不开!