首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用navigator.mediaDevices.getUserMedia记录浏览器音频

用navigator.mediaDevices.getUserMedia记录浏览器音频
EN

Stack Overflow用户
提问于 2018-02-03 16:27:33
回答 1查看 925关注 0票数 2

我正在录制来自麦克风的浏览器音频输入,并通过websocket将其发送到将流写入.wav文件的nodeJs服务。

我的问题是,第一次录音很好,但是后续的任何录音听起来都很慢,大约是录音速度的一半,因此无法使用。

如果我刷新浏览器,第一次录音再次工作,随后的录音速度减慢,这就是我确信nodeJs服务中没有问题的原因。

我的项目是一个角5项目。

我已经粘贴了下面我正在尝试的代码。

我使用的是binary.js -> https://cdn.jsdelivr.net/binaryjs/0.2.1/binary.min.js

代码语言:javascript
复制
this.client = BinaryClient(`ws://localhost:9001`)

createStream() {
    window.Stream = this.client.createStream();

    window.navigator.mediaDevices.getUserMedia({ audio: true }).then(stream => {
      this.success(stream);
    })
}

stopRecording() {
    this.recording = false;
    this.win.Stream.end();
}



success(e) {
    var audioContext = window.AudioContext || window.webkitAudioContext;
    var context = new audioContext();

    // the sample rate is in context.sampleRate
    var audioInput = context.createMediaStreamSource(e);

    var bufferSize = 2048;
    var recorder = context.createScriptProcessor(bufferSize, 1, 1);
}

recorder.onaudioprocess = (e) => {
  if (!this.recording) return;
  console.log('recording');
  var left = e.inputBuffer.getChannelData(0);
  this.win.Stream.write(this.convertoFloat32ToInt16(left));
}

audioInput.connect(recorder)
    recorder.connect(context.destination);
}

convertoFloat32ToInt16(buffer) {
    var l = buffer.length;
    var buf = new Int16Array(l)

    while (l--) {
      buf[l] = buffer[l] * 0xFFFF;    //convert to 16 bit
    }
    return buf.buffer
}

我对什么会出错感到困惑,所以如果有人有使用这种浏览器技术的经验,我会感谢你的帮助。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-06 05:33:58

我遇到了一个确切的问题-您的问题是样本率,您正在编写您的WAV文件是不正确的。

您需要将浏览器和麦克风使用的示例速率传递给写入二进制WAV文件的node.js。

客户端:

在成功的navigator.mediaDevices.getUserMedia (在您的例子中是success函数)之后,从AudioContext元素中获取sampleRate变量:

代码语言:javascript
复制
var _smapleRate = context.sampleRate;

然后将其作为参数传递给node.js侦听器。在我的例子中,我用:

代码语言:javascript
复制
binaryClient.createStream({ SampleRate: _smapleRate });

服务器(Node.js)侧:

使用传递的SampleRate设置WAV文件的示例速率。在我的例子中,这是代码:

代码语言:javascript
复制
fileWriter = new wav.FileWriter(wavPath, {
                channels: 1,
                sampleRate: meta.SampleRate,
                bitDepth: 16
             });

这将防止破碎的声音,低音调的声音,低或快速的WAV文件。

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48599488

复制
相关文章

相似问题

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