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();
});