Recorder.js计算并抵消记录的延迟

问题描述:

我使用Recorder.js录制来自Google Chrome桌面和移动浏览器的音频。在我的具体用例中,我需要准确记录3秒钟的音频,在特定时间开始和结束。Recorder.js计算并抵消记录的延迟

现在我知道在录制音频时,由于硬件延迟,您的声卡无法实时工作,所以总是有一个内存缓冲区,可以让您在不听到跳转/断断续续的情况下保持录制。

Recorder.js允许您为此准确地配置bufferLen变量,而sampleRate是从音频上下文对象中自动获取的。这里是它如何工作的一个简化版本:

var context = new AudioContext(); 
var recorder; 
navigator.getUserMedia({audio: true}, function(stream) { 
    recorder = new Recorder(context.createMediaStreamSource(stream), { 
     bufferLen: 4096 
    }); 
}); 

function recordLoop() { 
    recorder.record(); 
    window.setTimeout(function() { 
     recorder.stop(); 
    }, 3000); 
} 

我现在面临的问题是,记录()不能用于缓冲延迟偏移而且也不停止()。因此,不是获得三秒钟的声音,而是2.97秒,并且开始被切断。

这意味着我的录音不会在同一个地方开始,而且当我将它们循环时,根据您的设备延迟,这些循环的长度也会不同!

有两种可能的解决方案我在这里看到:

  • 调整Recorder.js代码自动抵消缓冲对您的开始/停止时间(也许添加新startSync/stopSync功能)
  • 计算延迟并创建两个偏移计时器以在正确的时间点启动和停止Recorder.js。

我试图解决方案2,因为解决方案1,需要缓冲阵列的知识,我没有:(我相信对于延迟的计算公式为:

var bufferSize = 4096; 
var sampleRate = 44100 
var latency = (bufferSize/sampleRate) * 2; // 0.18575963718820862 secs 

然而,当我运行这些计算在实际的测试中,我得到:

var duration = 2.972154195011338 secs 
var latency = 0.18575963718820862 secs 
var total = duration + latency // 3.1579138321995464 secs 

的东西是不正确的,它不会使3秒钟,它现在开始迷惑我,我已经创造了Recorder.js演示的工作叉日志:

http://kmturley.github.io/Recorderjs/

任何帮助将不胜感激。谢谢!

+0

已更新我的代码示例与工作版本。但将它作为Recorder.js – 2015-02-11 04:07:35

我对你对延迟的担忧有点困惑。是的,的确,可能的延迟将与缓冲区的长度有关,但还有很多其他延迟。无论如何,延迟时间与录制时间无关,这在我看来是您的问题所在。

如果您想要在44100 * 3 = 132,300个样本中记录一个完全3秒长的缓冲区。缓冲区大小为4096个样本,系统只记录该数字的偶数倍。鉴于最接近你将得到的是记录32或33完整的缓冲区。这给出了131072(2.97秒)或135168(3.065秒)的样本。

这里有几个选项。

  • 选择平均分割采样率的缓冲区长度。例如然后您可以准确记录12个缓冲区。
  • 记录比您需要的3.0秒稍长的时间,然后将额外的2868个样本丢弃。
+0

的一个功能添加会更好。如果我尝试使用自定义缓冲区大小,它会给出错误“Uncaught IndexSizeError:无法在'AudioContext'上执行'createScriptProcessor':缓冲区大小(4410)必须是256到16384之间的两倍。“现在要尝试第二个建议! – 2015-02-11 03:01:19

+0

不错,工作。在这里更新我的代码示例:http://kmturley.github.io/Recorderjs/但是我认为将它作为Recorder.js的一个选项比将它作为外部选项更有效。我试图添加一个setLength方法来设置记录长度,但这会引发错误:( – 2015-02-11 04:07:08

+0

得到这个工作与一个新的Recorder.js选项称为maxLength:https://github.com/kmturley/Recorderjs我已经发送拉请求图书馆的老板也谢谢你的帮助! – 2015-02-12 03:21:01