setSinkId() 函数在 Electron App 中抛出错误

Posted

技术标签:

【中文标题】setSinkId() 函数在 Electron App 中抛出错误【英文标题】:setSinkId() function throws error in Electron App 【发布时间】:2019-12-25 20:59:37 【问题描述】:

我正在尝试开发一个可以播放音频并包含更改音频设备功能的应用程序。我唯一的问题是当我尝试使用 setSinkId() 函数时,它给了我一个 DOMException AbortError 消息“无法执行操作并已中止”。我在最新版本的 Chrome 中尝试了完全相同的代码,它允许我设置 sinkId 没有任何问题。这是我的代码:

     var promise = audio.setSinkId(deviceID);

     promise.then(function(result) 
         console.log('Audio output device sink ID is ' + deviceID);
     , function(e) 
         console.log('Error: ' + e.name + ' - ' + e.message);
     );

我在设置浏览器窗口时尝试通过enableBlinkFeatures 传递AudioOutputDevices 参数,但这并没有什么不同。

【问题讨论】:

在哪个浏览器中报错?并非所有浏览器都支持 setSinkId。虽然,我必须承认,我希望在尚不支持它的浏览器上出现不同的错误消息。您可以在此页面查看该功能支持的浏览器列表:developer.mozilla.org/en-US/docs/Web/API/htmlMediaElement。 在我的情况下,当我的 Web 应用程序的用户关闭麦克风(作为输入设备)然后尝试更改输出设备时,用户收到此错误“未捕获(承诺)DOMException:操作无法执行并被中止”。对你有帮助吗? 【参考方案1】:

我感受到你的痛苦,我在开发过程中也有同样的问题。我没有直接解决它。我只能建议检查有关您的源 HTML 元素参考的一些事情。

1) srcObject 设置是否正确? 在第一次使用setSinkId()之前,请检查是否

audio.srcObject = stream;

2) 检查setSinkId() 事件是否未被pause()play()load() 事件中断。请记住,setSinkId() 是一个承诺。

await audio.setSinkId(selectedId);
audio.play();

希望对你有帮助。

【讨论】:

【参考方案2】:

也许它与这个旧报告的问题有关。它已搁置多年。

https://bugs.chromium.org/p/chromium/issues/detail?id=697877

请记住,要了解 Chromium,您应该使用您的 Google 帐户“启动”它,以帮助 Chromium 团队了解它的重要性。

【讨论】:

以上是关于setSinkId() 函数在 Electron App 中抛出错误的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:fs.​​existsSync 不是函数(Electron/ReactJS/Typescript)

Electron开发: 提升 Electron 应用的启动速度

如何在 Electron 上使用带有 TypeScript 类型支持的 require 内部函数或条件?

有没有办法让 Electron 主进程脚本使用 `postMessage` 函数监听页面发布的消息?

Electron Builder:“主进程发生错误 - 回调不是函数”

如何解决在electron里无法使用puppeteer的evaluate函数