Audio.play() 在 Electron webview 中被拒绝并出现 NotSupportedError

use*_*156 5 javascript electron

我正在运行一个 Electron (v2.0.3) 项目,它在 web 视图中执行脚本。其中一个脚本是在一定条件下播放本地音频文件。

但是,如果在 Web 视图中调用音频播放,则音频播放会被拒绝,而如果调用index.html或播放在线音频文件而不是本地音频文件,则音频播放可以正常工作。

我已将nodeIntegrationwebview 设置为 true,并确保 webview 没有静音。我想这不是自动播放政策的问题,因为如果我将 YouTube 视频和在线音频(例如http://www.pacdv.com/sounds/ambience_sounds/air_hum.wav)加载到网络视图中,它们可以完美地工作。

另外,文件路径和文件本身没有问题,因为当我直接在index.html.

这是我的index.html

<head>
    <script>
        function init() {
            web.addEventListener("dom-ready", () => {
                web.executeJavaScript('<my-script>'); 
            }); 
        }
    </script>
</head>
<body onload="init(); ">
    <webview id="web" src="http://www.google.com" 
        style="width: 800px; height: 600px; "
        webpreferences="nodeIntegration=true"></webview>
</body>
Run Code Online (Sandbox Code Playgroud)

以下是 的内容<my-script>

let path = `file://${require("electron").remote.app.getAppPath()}/xxx.mp3`; 
new Audio(path).play().then().catch(ex => {
    document.body.innerHTML = ex; 
}); 
Run Code Online (Sandbox Code Playgroud)

之后Audio.play(),promise 被拒绝并显示错误消息:

NotSupportedError: Failed to load because no supported source was found.
Run Code Online (Sandbox Code Playgroud)

我曾经想过跨源限制的可能性,但似乎并不是因为我可以像我之前所说的那样播放来自不同域的在线音频文件。

我怎样才能解决这个问题?这可能是一个错误吗?或者我忘记了一些限制?任何信息,将不胜感激。谢谢。

编辑:根据我的进一步测试,当我调用executeJavaScript()创建BrowserWindow.webContentsmain.js. 所以这似乎是一个限制,executeJavaScript而不是网络视图。

文档提到了限制,可以通过userGesture第二个参数进行配置executeJavaScript。然而,它仍然对我不起作用。

小智 0

在应用程序启动之前添加此行

app.commandLine.appendSwitch('autoplay-policy', 'no-user-gesture-required');
Run Code Online (Sandbox Code Playgroud)