gpt4 book ai didi

javascript - 从 getUserMedia 将约束应用于音轨

转载 作者:行者123 更新时间:2023-12-03 07:25:13 25 4
gpt4 key购买 nike

是否可以对正在运行的实时音轨应用约束?它似乎对我不起作用,至少在 Chrome v80 上。

假设我有一个流:

const stream = await navigator.mediaDevices.getUserMedia({
audio: {
autoGainControl: true
channelCount: 2
echoCancellation: true
noiseSuppression: true
},
video: false
});

现在,稍后我想更改其中一些参数:
for (const track of stream.getAudioTracks()) {
track.applyConstraints({
autoGainControl: false,
echoCancellation: false,
noiseSuppression: false
});
}

这没有效果。如果我调用 track.getConstraints() ,我看到了我的新约束,但在我重新加载页面并从头开始应用它们之前,它们听起来没有效果。此外,当我调用 track.getSettings() ,我看到我的新约束尚未应用。

我也试过调用 track.enabled = false在应用约束之前,使用 track.enabled = true之后,没有运气。

关于如何在不重新调用 getUserMedia() 的情况下使其正常工作的任何建议?

最佳答案

SO用户jib ,它适用于 Firefox 和 adapter.js 项目写了一个 blog post在 2017 年关于这个确切的功能。

以下是他们如何将约束应用于轨道:

async function apply(c) {
await track.applyConstraints(Object.assign(track.getSettings(), c));
update();
}
c是具有要添加的特定约束的对象。

他们这样做是因为在传递
MediaTrackConstraints字典将在 applied 时重置为默认值.

现在,您的解决方案应该也适用于您设置的属性。

所以使用这个 fiddle 我确实尝试了我的 macOS 机器上的几个 UA:

Chrome

正如您所报告的, 不应用设置。

这里是 the issue跟踪即将实现的。

从这个问题的评论中,您还可以找到一种解决方法,这意味着从同一 deviceId 请求新的 MediaStream。作为你得到的,并应用所需的约束。

Here is a fork of jib's fiddle with such a workaround.请注意 deviceId来自 track.getSettings()
async function apply(c) {
track.stop(); // required
const new_constraints = Object.assign(track.getSettings(), c, );
const new_stream = await gUM({ audio: new_constraints });

updateSpectrum( audio.srcObject = new_stream );
track = new_stream.getAudioTracks()[0];
update();
}

火狐

无缝工作。

苹果浏览器

严重崩溃。 在我的机器上,运行原始 fiddle ,只调整频谱将完全崩溃整个浏览器的 gUM。
- 当前流已停止
- 任何获取新流的尝试都会失败 - 直到重新启动整个应用程序。

我们为 Chrome 制作的 fork fiddle 至少不会崩溃,但它似乎也没有产生任何可听见的变化......

关于javascript - 从 getUserMedia 将约束应用于音轨,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60873347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com