Web Audio getUserMedia约束无效

时间:2018-08-29 18:44:55

标签: javascript web-audio web-audio-api

我有一些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文档,但无法弄清楚为什么我似乎无法控制音量,延迟等...

1 个答案:

答案 0 :(得分:0)

简短答案:

您指定的约束可能不是由浏览器处理的,或者是由系统更改的,因为默认情况下将值解释为ideal

长答案:

here (check here also the browser compatibility)讨论了navigator.mediaDevices.getUserMedia接受的约束。可以将每个约束的值指定为minmaxexactideal(这是默认值),如here所述。 >

“使用maxminexact中的任何一个或全部指定的约束总是被视为强制性的。如果任何使用一个或多个约束的约束不能被兑现,诺言将被拒绝。”

系统可以调整指定为ideal的约束(请记住,这是默认设置!),其值会与您要求的值不同。