首页 > 解决方案 > Web Audio getUserMedia 约束无效

问题描述

我有一些 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);
});

如您所见,我创建了一个“约束”变量,它定义了一些音频设置,但除了 deviceId 属性之外,它似乎没有改变任何东西。即使我设置{audio: {volume: 0}}我得到相同的声音输出。

我一直在阅读有关 MediaStreamConstraints 等的 MDN 文档,但无法弄清楚为什么我似乎无法控制音量、延迟……

标签: javascriptweb-audio-api

解决方案


简短的回答:

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

长答案:

navigator.mediaDevices.getUserMedia此处讨论了所接受的约束(请在此处查看浏览器兼容性)。每个约束的值可以指定为minmaxexactideal(这是默认值),如此所述。

“使用任何或所有 , 或 指定的约束maxminexact始终被视为强制性约束。如果无法满足使用其中一个或多个约束的任何约束 [...],则承诺将被拒绝。”。

ideal系统可以调整指定为(记住这是默认值!)的约束,从而产生与您请求的值不同的值。


推荐阅读