Recorder.js 计算和偏移记录的延迟
Recorder.js calculate and offset recording for latency
我正在使用 Recorder.js 从 Google Chrome 桌面和移动浏览器录制音频。在我的特定用例中,我需要准确记录 3 秒的音频,在特定时间开始和结束。
现在我知道在录制音频时,由于硬件延迟,您的声卡无法实时工作,所以总有一个内存缓冲区可以让您在不听到声音的情况下继续录制jumps/stutters。
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 代码以根据您的 start/stop 次自动偏移缓冲区(可能添加新的 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=132,300 个样本。缓冲区大小为 4096 个样本,系统只会记录该数字的偶数倍。假设您最接近的是记录 32 或 33 个完整缓冲区。这给出了 131072(2.97 秒)或 135168(3.065 秒)个样本。
这里有几个选项。
- 选择能平均分配采样率的缓冲区长度。例如11025。然后您可以准确记录 12 个缓冲区。
- 记录比您需要的 3.0 秒稍长的时间,然后丢弃多余的 2868 个样本。
我正在使用 Recorder.js 从 Google Chrome 桌面和移动浏览器录制音频。在我的特定用例中,我需要准确记录 3 秒的音频,在特定时间开始和结束。
现在我知道在录制音频时,由于硬件延迟,您的声卡无法实时工作,所以总有一个内存缓冲区可以让您在不听到声音的情况下继续录制jumps/stutters。
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 代码以根据您的 start/stop 次自动偏移缓冲区(可能添加新的 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=132,300 个样本。缓冲区大小为 4096 个样本,系统只会记录该数字的偶数倍。假设您最接近的是记录 32 或 33 个完整缓冲区。这给出了 131072(2.97 秒)或 135168(3.065 秒)个样本。
这里有几个选项。
- 选择能平均分配采样率的缓冲区长度。例如11025。然后您可以准确记录 12 个缓冲区。
- 记录比您需要的 3.0 秒稍长的时间,然后丢弃多余的 2868 个样本。