Recorder.js计算并偏移记录的延迟
Recorder.js calculate and offset recording for latency
我正在使用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/
如有任何帮助,我们将不胜感激。谢谢
您对延迟的担忧让我有点困惑。是的,最小可能的延迟确实与缓冲区的长度有关,但还涉及许多其他延迟。无论如何,延迟与录制持续时间无关,在我看来,这就是你的问题所在。
如果您想在44100处记录一个正好3秒长的缓冲区,即44100*3=132300个样本。缓冲区大小为4096个样本,系统只会记录该数字的偶数倍。假设最接近的是记录32或33个完整的缓冲区。这得到131072(2.97秒)或135168(3.065秒)样本。
这里有几个选项。
- 选择一个缓冲区长度,该长度平均除以采样率。例如11025。然后,您可以记录正好12个缓冲区
- 记录的时间比你需要的3.0秒稍长,然后扔掉额外的2868个样本
- 使用Dnamics CRM 2011中的JavaScript读取子网格的所有记录,而不考虑活动页面
- 可以简化嵌套的延迟Q Promises解析吗
- onclick函数需要双击,因为类分配延迟
- AngularJs对所有页面中的所有记录进行排序
- 有没有一种方法可以在控制台关闭的情况下让console.log()在IE中记录消息
- 更多延迟动画
- window.location替换并传递URL历史记录条目中的变量
- Javascript历史记录转换为php行
- 对父作用域的指令更新延迟了一步
- JavaScript,PHP-用JavaScript将多个数据库记录发送到变量或表
- 为JS函数添加延迟
- 猫鼬在特定记录中查找嵌套记录
- 浏览器何时记录历史记录
- 带有延迟的循环每次应运行5次
- 关键帧之间的css3动画延迟
- Recorder.js计算并偏移记录的延迟
- Android Java 处理程序在循环中的每个记录处发布延迟
- JQuery 数据表延迟加载导出数据到 pdf、excel 等,不显示所有记录
- 如何在浏览器中确定和记录远程服务器的延迟
- 使用django-el-pagination(延迟分页)保存浏览器历史记录