我有一些Javascript输出(来自麦克风或其他东西的)输入流,中间有一些AudioNodes返回默认输出,但是我遇到了大量延迟的麻烦。
为了更加精确一点,我已经将吉他连接到Behringer UCG102 USB接口,并且已经在显示输入波形的简单网页上捕获了该设备的流。
var constraints = {
audio: {
deviceId: selectedDevice.deviceId,
sampleSize: 16,
sampleRate: 16000,
latency: 4
}
};
navigator.mediaDevices.getUserMedia(constraints)
.then(function(stream) {
var audioCtx = new AudioContext();
var source = audioCtx.createMediaStreamSource(stream);
var gainNode = audioCtx.createGain();
var compressor = audioCtx.createDynamicsCompressor();
compressor.threshold.value = -50;
compressor.knee.value = 40;
compressor.ratio.value = 12;
compressor.attack.value = 0;
compressor.release.value = 0.25;
source.connect(compressor);
// debug audio analyser created here
var analyser = audioCtx.createAnalyser();
compressor.connect(analyser);
analyser.connect(gainNode);
analyser.fftSize = 2048;
var bufferLength = analyser.frequencyBinCount;
var dataArray = new Uint8Array(bufferLength);
analyser.getByteTimeDomainData(dataArray);
// Drawing the analyser code was here...
gainNode.connect(audioCtx.destination);
});
如您所见,我创建了一个'constraints'变量,该变量定义了一些音频设置,但是除了deviceId属性之外,它似乎什么都没有改变。即使设置了{audio: {volume: 0}}
,我也会得到相同的声音输出。
我一直在阅读有关MediaStreamConstraints的MDN文档,但无法弄清楚为什么我似乎无法控制音量,延迟等...
答案 0 :(得分:0)
简短答案:
您指定的约束可能不是由浏览器处理的,或者是由系统更改的,因为默认情况下将值解释为ideal
。
长答案:
here (check here also the browser compatibility)讨论了navigator.mediaDevices.getUserMedia
接受的约束。可以将每个约束的值指定为min
,max
,exact
或ideal
(这是默认值),如here所述。 >
“使用max
,min
或exact
中的任何一个或全部指定的约束总是被视为强制性的。如果任何使用一个或多个约束的约束不能被兑现,诺言将被拒绝。”
系统可以调整指定为ideal
的约束(请记住,这是默认设置!),其值会与您要求的值不同。