已更新(可重现)-使用MediaRecorder API(音频/ webm作品)录制时的间隔

时间:2018-07-21 10:45:42

标签: html5 ffmpeg audio-recording mediarecorder 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"' }) recorder.ondataavailable = function(e) { // Read blob from `e.data`, decode64 and send to sever; } recorder.start(1000) })

问题是,连接所有部件时得到的WebM文件已损坏(很少)!我可以将其作为WebM播放,但是当我尝试将其转换为其他格式时,它会给我一个定时偏移的文件。

例如。我正在尝试将持续时间为00:36:27.78的文件转换为wav,但是我得到的持续时间为00:36:26.04的文件少了1.74s。

在文件开头-音频是相同的,但是大约10分钟后,WebM文件播放的延迟很小。

经过一番研究,我发现它也不能正确地与浏览器的MediaSource API一起播放,而我用来播放这些块。我尝试了两种播放这些大块的方法:

在我只是将所有部分合并为一个blob的情况下,它工作正常。 如果我通过sourceBuffer对象添加它们,则存在一些间隙(我可以通过检查buffered属性来看到它们)。 697.196-697.528(〜330ms) 996.198-996.754(〜550ms) 1597.16-1597.531(〜370ms) 1896.893-1897.183(〜290ms)

这些间隙总计为1.55s,它们恰好位于wav和webm文件之间开始不同步的位置。不幸的是,可复制的文件无法共享,因为它是客户的私人数据,而且我还无法在其他媒体上复制该问题。

什么可能导致此问题?

-----更新----- 我能够在https://jsfiddle.net/96uj34nf/4/

上重现该问题

要查看问题,请单击“打印缓冲区”按钮,它将显示时间范围。您可以看到存在两个差距: 0-136.349、141.388-195.439、197.57-198.589

  1. 136.349-141.388
  2. 195.439-197.57

因此,您可以看到分别有5秒和2秒的间隔。如果有人可以阐明发生的原因或如何避免此问题,那将很高兴。

谢谢

1 个答案:

答案 0 :(得分:1)

已经7个月了,所以我想您已经解决了这个问题,但是万一没有...

当我们开始使用MediaRecorder时,我们遇到了一些问题,包括记录消失(也许超过了RAM配额,然后释放了阵列或类似的东西)

解决我们所有问题的方法是立即将每个块放入indexdb objectStore中,然后将其保存到磁盘,并在记录结束时将所有这些块构建为blob并下载。无需进一步处理这些块,仅需要完整的文件。

我知道这不能回答您的问题,但也许可以帮忙。