首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >延迟的Recorder.js计算和偏移记录

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

Stack Overflow用户
提问于 2015-02-10 04:27:40
回答 1查看 2.4K关注 0票数 1

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

现在我知道,在录制音频时,由于硬件延迟,您的声卡无法实时工作,因此始终有一个内存缓冲区,它允许您在没有听跳/口吃的情况下继续录制。

Recorder.js允许您为此精确地配置bufferLen变量,而sampleRate则自动从音频上下文对象中获取。以下是其工作方式的简化版本:

代码语言:javascript
运行
复制
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需要了解我没有的缓冲区数组:(我认为延迟的计算是:

代码语言:javascript
运行
复制
var bufferSize = 4096;
var sampleRate = 44100
var latency = (bufferSize / sampleRate) * 2; // 0.18575963718820862 secs

然而,当我在一个真正的测试中运行这些计算时,我得到:

代码语言:javascript
运行
复制
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/

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-10 04:46:21

我被你对延迟的担心弄糊涂了。是的,的确,最小可能的延迟将与缓冲区的长度相关,但还有许多其他延迟。在任何情况下,延迟与录制时间无关,在我看来,这就是你的问题。

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

你有几个选择。

  • 选择一个缓冲区长度,以均匀地划分采样率。例如11025。然后,您可以记录确切的12个缓冲区。
  • 记录稍长于你需要的3.0秒,然后扔掉额外的2868个样本。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28424111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档