Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript web自动播放策略更改恢复上下文不';t取消静音音频_Javascript_Google Chrome_Autoplay_Web Audio Api_Audiocontext - Fatal编程技术网

Javascript web自动播放策略更改恢复上下文不';t取消静音音频

Javascript web自动播放策略更改恢复上下文不';t取消静音音频,javascript,google-chrome,autoplay,web-audio-api,audiocontext,Javascript,Google Chrome,Autoplay,Web Audio Api,Audiocontext,我正在开发一个渐进式的网络应用程序,主要用于桌面和安卓系统上播放音乐。在个人电脑上,一切正常。在Android上,它突然停止工作。经过一些研究,我发现了关于chrome中自动播放策略更改的更新 要点是,如果没有用户交互,就不能再只播放媒体了 在这次更新之前,我有自己的AudioContext,它被创建为onload,之后才被使用。这不管用了 更新帖子指出: 文档收到用户手势后,必须创建或恢复AudioContext以启用音频播放 因此,我对应用程序的.suspend()和.resume()上下文

我正在开发一个渐进式的网络应用程序,主要用于桌面和安卓系统上播放音乐。在个人电脑上,一切正常。在Android上,它突然停止工作。经过一些研究,我发现了关于chrome中自动播放策略更改的更新

要点是,如果没有用户交互,就不能再只播放媒体了

在这次更新之前,我有自己的AudioContext,它被创建为
onload
,之后才被使用。这不管用了

更新帖子指出:

文档收到用户手势后,必须创建或恢复AudioContext以启用音频播放

因此,我对应用程序的
.suspend()
.resume()
上下文进行了相应的调整
onPlay
onPause

在个人电脑上这仍然有效,在安卓上则不然。我错过什么了吗

编辑1:

我发现该网站声明如下:

根据新政策,媒体内容将被允许在 以下情况:

a) 内容是静音的,或不包含任何音频(仅视频)

b) 用户在浏览过程中点击或点击了网站上的某个地方 会议

c) 在移动设备上,如果用户已将站点添加到主屏幕

d) 在桌面上,如果用户经常在站点上播放媒体, 根据媒体参与度指数

我知道这是真的,如果其中一个匹配。在我的情况下,b)和c)都得到了满足。 所以我想这应该行得通吧

您需要在用户操作事件(如单击按钮)的音频上下文中调用resume()。我猜您的问题是调用context.resume()的位置不在用户交互事件上。你不能只从onLoad调用它

示例代码:

// Existing code unchanged.
window.onload = function() {
  var context = new AudioContext();
  // Setup all nodes
  ...
}

// One-liner to resume playback when user interacted with the page.
document.querySelector('button').addEventListener('click', function() {
  context.resume().then(() => {
    console.log('Playback resumed successfully');
  });
});

医生在这里描述它:

@kaido-Hm我明白了。我想我必须看看如何同步执行此操作,因为到目前为止,我一直在使用vuex模块,在我的例子中,这些模块异步触发操作。也许我可以添加一个同步初始化操作或类似的东西。。你能为两种不同的自动播放提供来源吗?也许这有助于澄清我的困惑不幸的是,这只是我自己的经验,可能不正确。。。(重读你的错误信息往往会证明我错了)他们改变了很多关于这些政策的事情,而且文档很难粘在一起。但是再一次从经验来看,在所有UAs上,用户手势内部的反应总是有效的。关于这个问题的一些讨论:chrome和specs,所以我错了,似乎他们对AudioContext和MediaElement.autoplay使用相同的策略。现在我不知道为什么它对你不起作用,也许你尝试使用AudioContext会抛出一个错误,即使在用户授予了所需的手势之后,也会阻止正常的行为?您可以通过检查AudioContext的
状态
属性来防止它。如果设置为“暂停”,请不要尝试任何操作。谢谢您的输入,我非常感谢。我很确定在用户输入之前我不会使用上下文,因为只有当用户点击“播放”某个内容时,我才开始从远程主机加载音频源。一旦加载完成,它将被解码,上下文将恢复并播放。如果用户按pause,我将停止节点并暂停上下文,直到他再次单击play。