【问题标题】:No metadata when recording an audio webm with MediaRecorder使用 MediaRecorder 录制音频 webm 时没有元数据
【发布时间】:2018-09-05 13:23:19
【问题描述】:

对于我的项目,我使用 MediaRecorder 录制用户音频,它几乎可以正常工作。当我希望使用 Wavesurfer.js 显示用户记录的波形时,我的问题就出现了,它不会加载我的记录。不过,使用 Audio 元素播放录音效果很好。

在尝试了不同的来源后,发现这是因为最终的 .webm 文件没有太多元数据,甚至没有持续时间或比特率(即使我在 MediaRecorder 选项中设置了它)。 以下是 ffprobe 的输出以及其中一个文件:

输入#0,matroska,webm,来自“206_3.webm”:
元数据:
编码器:Chrome
持续时间:不适用,开始:0.000000,比特率:不适用
Stream #0:0(eng):音频:opus,48000 Hz,单声道,fltp(默认)

所以我的问题是:我在录制音频方面做错了吗?以下是我开始录制的方式:

// Somewhere in the code...
this._handleUserMedia(await navigator.mediaDevices.getUserMedia({ audio: true }));

// ... and elsewhere
_handleUserMedia(stream) {
    this._mediaRecorder = new MediaRecorder(stream, { audioBitsPerSecond : 64000 });

    this._mediaRecorder.ondataavailable = event => {
      this._mediaBuffer.push(event.data);
    };

    this._mediaRecorder.onstop = () => {
      // Ajoute le buffer et une URL vers le buffer dans les résultats pour la sauvegarde et le playback
      let blob = new Blob(this._mediaBuffer, { type: "audio/webm" });
      this.state.results[this.state.currentWordIdx].recordingBlob = blob;
      this.state.results[this.state.currentWordIdx].recordingUrl = URL.createObjectURL(blob);

      // Réinitialise le buffer pour l'enregistrement suivant
      this._mediaBuffer = [];

      this._gotoNextWord();
    };

    this._gotoNextWord();
  }

如您所见,我创建了一个 blob,稍后我会使用 NodeJS 的 fs.writeFile 保存它。然后当我需要显示波形时,我使用fs.readFile 加载文件,如下所示:

fs.readFile(`${this.getAppData()}/${filePath}`, (err, buffer) => {
    if (err) { reject(err); }
    const blob = new Blob([buffer], {type : 'audio/webm'});
    resolve(URL.createObjectURL(blob)); // Si besoin d'un ArrayBuffer => toArrayBuffer(buffer)
});

【问题讨论】:

  • 您的问题有解决方案吗?
  • 我没有。我后来离开了这个项目。
  • 多年后有什么办法吗??我现在正面临着这个。如果我尝试将服务器中的 webm 转换为 wav 或任何其他格式,我会得到什么好处吗?
  • 对不起@J.MARS,我已经离开这个项目很久了,我从来没有完成那个:-/

标签: javascript node.js web-audio-api wavesurfer.js


【解决方案1】:

我相信元数据很少的原因是默认情况下,MediaRecorder 将生成一个variable bit rate 文件,对于该文件,单个比特率值没有意义 - 大概(虽然我不确定)导致缺乏明确持续时间值也是如此。

规范最近允许将a constant bitrate for recording 设置为implementation soon to land in Chromium (M89)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多