【发布时间】: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 会更好
标签: javascript audio web-audio-api recorder.js