Html 音频标签自动播放在移动设备中不工作

Html 音频标签自动播放在移动设备中不工作,html,audio,Html,Audio,我正在使用此代码,当我看到控件时,我看到自动播放不工作 而且它在移动设备上不起作用,在网站上也很有效。 谁能告诉我这个问题吗 非常感谢,非常感谢在移动浏览器中无法让autoplay正常工作。(这是不允许的) 但有些技巧可以做到这一点 点击下面的链接查看一些技巧 现在是2020年 请注意(出于以下原因?)Chrome已更改其自动播放策略(请参阅),因此您现在必须: resume()用户与页面进行某些(任何)交互后的音频上下文 或者“排名靠前”(即相信Chrome不会根据用户和世界的行为默认停

我正在使用此代码,当我看到
控件时,我看到自动播放不工作

而且它在移动设备上不起作用,在网站上也很有效。 谁能告诉我这个问题吗


非常感谢,非常感谢

在移动浏览器中无法让autoplay正常工作。(这是不允许的)

但有些技巧可以做到这一点

点击下面的链接查看一些技巧

现在是2020年

请注意(出于以下原因?)Chrome已更改其自动播放策略(请参阅),因此您现在必须:

  • resume()
    用户与页面进行某些(任何)交互后的音频上下文
  • 或者“排名靠前”(即相信Chrome不会根据用户和世界的行为默认停止音频)
  • 或者(据我所知)用户必须在原点A上,然后单击指向同一原点A的链接,A的新页面可以自动播放内容

您可以使用API播放声音,并从任何
ArrayBuffer
(即:从
XMLHttpRequest
文件中获取源代码)

适用于Chrome和Firefox手机和桌面

重要注意事项

值得一提的是,IMO,这个“把戏”实际上可以被视为一个浏览器bug,如果浏览器认为这会破坏用户体验/成为一个广泛使用的烦恼(如广告),它可能在任何时候都不再起作用

还值得一提的是,至少在我的手机和FF 54上,即使手机静音,声音仍会播放

还值得一提的是,用户可以通过浏览器的常用选项或更高级的
about:config
页面设置
autoplay
行为以满足他们的愿望和需要(
autoplay
行为由Firefox的
media.autoplay.enabled
media.block autoplay设置,直到进入前台
首选项)


因此,无论你怎么做,强制音频
自动播放都是一个糟糕的UX主意。

我对这个问题有很多经验。它也适用于在用户有机会与页面交互之前加载的Javascript音频


然而,一旦用户点击了任何东西,游戏就开始了。我个人建议在首页上设置一个完整的页面入口覆盖:“点击进入我很棒的网站!”如果用户进入该页面,他们注定会听到你想向他们发出的任何声音!:D

关于自动播放
audio
标签,你是对的,但似乎你可以使用
AudioContext
自动播放声音(见我的答案)那么为什么支持它呢?参考:必须指出,对于大于1 MB的音频文件,此解决方案将导致内存泄漏或大量使用内存。据估计,1 MB编码的音频文件在内存中的数据解码缓冲区为11 MB。@FarzadYZ如果您能证明他们的解决方案是“内存泄漏”,那将非常有趣(我怀疑这不是执行JS代码的问题,而是浏览器的问题,即执行者)或“巨大的内存消耗”(与通常的音频标签相比)加载音频,使用web audio API的
上下文对其进行解码。decodeAudioData
,创建
AudioBufferSourceNode
,并播放该音频 这给了你更多的灵活性,但也带来了一个相当重要的警告:它会使你的手机崩溃。原因很简单。浏览器需要将解码后的整个音频片段存储在内存中 因为5Mb mp3文件通常相当于55Mb wav文件 如果您使用的是大型音频文件,您会很快发现自己的内存不足。当这种情况发生时,您发现它的方式是整个选项卡都在运行。来源:这都是关于缓冲区的,而不是简单的原始内存数据。因此,Firefox开发工具对MDN示例没有显示巨大的内存打印,因此经验来源(它试图推广另一个JS框架)似乎只是关于“我撞坏了我的手机并盲目地指责了音频缓冲区”ios中的IMOopera mini默认支持自动播放,而chrome、firefox和safari没有也没有提供打开选项。
    window.addEventListener('load', function () {
        var audioCtx = new (window.AudioContext || window.webkitAudioContext)();
        var source = audioCtx.createBufferSource();
        var xhr = new XMLHttpRequest();
        xhr.open('GET', 'audio-autoplay.wav');
        xhr.responseType = 'arraybuffer';
        xhr.addEventListener('load', function (r) {
            audioCtx.decodeAudioData(
                    xhr.response, 
                    function (buffer) {
                        source.buffer = buffer;
                        source.connect(audioCtx.destination);
                        source.loop = false;
                    });
            source.start(0);
        });
        xhr.send();
    });