4 votes

Audio.play() rejeté avec NotSupportedError dans la webview Electron

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.

0voto

BANSAL Points 1

Ajouter cette ligne avant le démarrage de l'application

app.commandLine.appendSwitch('autoplay-policy', 'no-user-gesture-required');

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X