我正在构建一个 JavaScript 应用程序以在单个页面上同时显示屏幕共享和相机输入。目的是使用这些应用程序自己的共享工具将该浏览器选项卡共享到其他应用程序(Zoom 等)中(所以我自己没有使用 WebRTC)。一切都很好,除了音频。
我感兴趣的音频来自单个(非基于网络的)应用程序,所以我知道捕获它的唯一方法是捕获整个屏幕和系统音频。但是,如果我将这个媒体分配给一个视频对象(练习的重点),我就会被困在一块石头和一个坚硬的地方之间。如果我将视频对象静音,听起来不错,但是,将选项卡共享给外部应用程序不会发送任何音频,因为。如果我不使视频对象静音,我会得到回声——不是来自我的麦克风,而仅仅是因为来自视频对象的声音现在是系统音频的一部分,然后会反馈到屏幕共享中。
问题对我来说很清楚,解决方案不是。原则上,echoCancellation 设置似乎是为处理这个问题量身定做的,但它没有任何效果。否则我没有正确使用它。我将它作为对 getDisplayMedia() 调用的约束:
var displayMediaOptions = {
video: {
cursor: "always"
},
audio: {
autoGainControl: false,
echoCancellation: true,
noiseSuppression: false
}
};
并调用:
videoElem.srcObject = await navigator.mediaDevices.getDisplayMedia(displayMediaOptions);
关于它是如何工作的,我有什么遗漏吗?或者我可以使用一些技巧来使我的应用程序的输出作为“标签音频”提供给想要共享标签的程序,但不知何故不将其包含在系统音频中?
我尝试阅读有关 Web Audio API 的内容,看看是否有帮助,这似乎很有希望,但它也相当令人难以抗拒。我真的是一个新手。