我正在使用MediaRecorder API录制语音,为什么块小于实际大小?

时间:2018-12-26 11:19:36

标签: ruby mediarecorder-api

我在MediaRecorder API(https://www.w3.org/TR/mediastream-recording/#mediarecorder-api)上遇到问题。

我正在使用它来录制使用Chrome浏览网页中的语音,并将其另存为大块。我需要能够在录制时和播放时播放它,因此保留这些块很重要。

这是记录数据的代码:

navigator.mediaDevices.getUserMedia({ audio: true, video: false }).then(function(stream) {

  recorder = new MediaRecorder(stream, { mimeType: 'audio/webm; codecs="opus"' })

  var previous_timecode = null

  recorder.ondataavailable = function(e) {

    duration = previous_timecode ? e.timecode - previous_timecode : null
    previous_timecode = e.timecode

    // Read blob from `e.data`, decode64 and send to sever;
    // Additionally send the duration calculated from the events;
    // Duration of first chunk is calculated in a different way.
  }

  recorder.start(1000)

})

这个问题实际上只发生过一次,但仍然是一个令人恐惧的问题。问题是在录制的7分钟内,我只有5分钟的音频。分析数据块给了我以下输入-在某些时候,数据块变得比预期的要小得多-数据每秒发出一次,但数据块的持续时间约为400-700ms。

音频是正确的,没有任何间隙,只是延迟越来越大。在某些时候,块的持续时间有所增加-一块中增加了4.8秒,但总延迟仍然增加到了约2分钟。

在随附的CSV https://transfer.sh/stgnW/1.csv中,您可以看到使用ffmpeg计算的每个数据块的持续时间(包含前n个数据块的音频文件大小减去包含前n-1个数据块的文件大小),以及通过e计算的持续时间.timecode值。

看起来有些节流问题-chrome中有类似的东西吗?我该如何修正我的代码,以确保它不会被限制?

1 个答案:

答案 0 :(得分:0)

这是一个冒险,但请尝试删除可能在具有以下限制的音频上执行的所有浏览器级处理:

  • echoCancellation:false
  • autoGainControl:false
  • noiseSuppression:false