Je travaille sur un projet Electron (v2.0.3) qui exécute des scripts dans une webview. L'un des scripts est de jouer un fichier audio local sous certaines conditions.
Cependant, la lecture audio est rejetée si elle est appelée à l'intérieur d'une vue web, alors qu'elle fonctionne correctement si elle est appelée dans une vue web. index.html
ou si un fichier audio en ligne est lu au lieu d'un fichier local.
J'ai mis nodeIntegration
de la webview à true, et je me suis assuré que la webview n'est pas en sourdine. Je suppose que la politique de lecture automatique ne pose pas de problème, car les vidéos YouTube et les fichiers audio en ligne (par ex. http://www.pacdv.com/sounds/ambience_sounds/air_hum.wav ) fonctionne parfaitement si je les charge dans la vue Web.
De même, le chemin d'accès au fichier et le fichier lui-même ne posent pas de problème, car il fonctionne correctement lorsque j'exécute le script directement à l'intérieur. index.html
.
Voici mon 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>
Voici le contenu de <my-script>
:
let path = `file://${require("electron").remote.app.getAppPath()}/xxx.mp3`;
new Audio(path).play().then().catch(ex => {
document.body.innerHTML = ex;
});
Après Audio.play()
la promesse est rejetée et le message d'erreur s'affiche :
NotSupportedError: Failed to load because no supported source was found.
J'ai déjà pensé à la possibilité de limitations d'origine croisée, mais il semble que ce ne soit pas le cas, car je peux lire des fichiers audio en ligne provenant de différents domaines, comme je l'ai indiqué précédemment.
Comment puis-je résoudre ce problème ? S'agit-il d'un bogue ? Ou ai-je oublié une restriction ? Toute information sera appréciée. Merci.
Editer : D'après mes tests complémentaires, cette erreur se produit également lorsque j'appelle executeJavaScript()
sur le BrowserWindow.webContents
créé par main.js
. Il semble donc qu'il s'agisse d'une limitation concernant executeJavaScript
plutôt que la vue web.
T documents ont mentionné la userGesture
qui peut être configurée par le deuxième paramètre de la rubrique executeJavaScript
. Cependant, cela ne fonctionne toujours pas pour moi.