Recorder.js 计算和偏移记录的延迟

Posted

技术标签:

【中文标题】Recorder.js 计算和偏移记录的延迟【英文标题】:Recorder.js calculate and offset recording for latency 【发布时间】:2015-02-10 04:27:40 【问题描述】:

我正在使用 Recorder.js 从 Google Chrome 桌面和移动浏览器录制音频。在我的特定用例中,我需要准确录制 3 秒的音频,在特定时间开始和结束。

现在我知道,在录制音频时,由于硬件延迟,您的声卡无法实时工作,因此始终有一个内存缓冲区可以让您继续录制而不会听到跳跃/卡顿。

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);

我面临的问题是 record() 不会抵消缓冲区延迟,stop() 也不会。所以不是得到三秒的声音,而是 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/

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

【问题讨论】:

已使用工作版本更新了我的代码示例。但是,将其作为一个功能添加到 Recorder.js 会更好 【参考方案1】:

您对延迟的担忧让我有些困惑。是的,最小可能的延迟确实与缓冲区的长度有关,但还涉及许多其他延迟。无论如何,延迟与录制持续时间无关,在我看来,这就是您的问题所在。

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

这里有几个选项。

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

【讨论】:

如果我尝试使用自定义缓冲区大小,它会给出错误“未捕获的 IndexSizeError:无法在 'AudioContext' 上执行 'createScriptProcessor':缓冲区大小 (4410) 必须是 256 和16384。”现在就尝试第二个建议! 很好用。在此处更新我的代码示例:kmturley.github.io/Recorderjs 但是我认为将其作为选项添加到 Recorder.js 比在外部执行更有效。我尝试添加一个 setLength 方法来设置录制长度,但这会引发错误:( 使用名为 maxLength 的新 Recorder.js 选项来实现这一点:github.com/kmturley/Recorderjs 我也向库所有者发送了拉取请求。感谢您的帮助!

以上是关于Recorder.js 计算和偏移记录的延迟的主要内容,如果未能解决你的问题,请参考以下文章

使用 Recorder.js 在音频记录中“获取音频时出错”

如何使用 recorder.js 对象调用此函数“.record()”?

奇怪的计算着色器延迟

Recorder.js+百度语音识别全栈方案技术细节

基于loghub的消息消费延迟监控

基于recorder.js H5录音功能