javascript - 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 文档,但无法弄清楚为什么我似乎无法控制音量、延迟……
解决方案
简短的回答:
您指定的约束可能不是由您的浏览器处理,也可能由系统更改,因为默认情况下将值解释为ideal
.
长答案:
navigator.mediaDevices.getUserMedia
此处讨论了所接受的约束(请在此处查看浏览器兼容性)。每个约束的值可以指定为min
、max
、exact
或ideal
(这是默认值),如此处所述。
“使用任何或所有 , 或 指定的约束max
,min
或exact
始终被视为强制性约束。如果无法满足使用其中一个或多个约束的任何约束 [...],则承诺将被拒绝。”。
ideal
系统可以调整指定为(记住这是默认值!)的约束,从而产生与您请求的值不同的值。
推荐阅读
- android - React Native - XML中的活动识别权限请求,仍然请求权限
- reactjs - 如何聚合对象属性?
- pdf - 以 PDF 格式正确保存以驱动 Google 表格
- python - python - 如何通过python folium中的IP地址定位用户位置以映射?
- c++ - 不断减去的累积变量,直到达到 0 值
- python - 为什么工作时间不使用 GUI 休眠?
- python - 绘制两个变量函数
- dataframe - 将 data.frame 转换为地理空间数据类
- node.js - AWS Node.js Lambda:承诺拒绝不返回自定义错误,解决工作
- html - CSS网格自动高度列