如何最好地检测浏览器的HTML5视频元素是否支持自动播放?
在当前的iOS Safari上,例如autoplay is disabled .
Update: 我现在设计的网页无论是否支持自动播放,它都能正常工作 . 现在,当加载页面时,将显示初始化视频 . 在iPad上,向用户显示一个大的播放按钮 . 触发播放后,视频将被隐藏 . 之后,video player的播放可以通过JavaScript控制,这是我真正需要的 .
如何最好地检测浏览器的HTML5视频元素是否支持自动播放?
在当前的iOS Safari上,例如autoplay is disabled .
Update: 我现在设计的网页无论是否支持自动播放,它都能正常工作 . 现在,当加载页面时,将显示初始化视频 . 在iPad上,向用户显示一个大的播放按钮 . 触发播放后,视频将被隐藏 . 之后,video player的播放可以通过JavaScript控制,这是我真正需要的 .
9 回答
派对有点晚了,但接受的解决方案似乎已经过时了:Modernizr现在已经实现了这个功能,请参阅https://github.com/Modernizr/Modernizr/blob/master/feature-detects/video/autoplay.js
包含与此处发布的其他解决方案类似的黑客攻击,但只要浏览器不公开此功能的可用性,这似乎是目前最好的解决方案 .
请注意,这是一个自Modernizr 3以来可用的异步测试,因此您必须使用以下
.on()
语法进行测试:亲眼看看:http://codepen.io/anon/pen/VYoWWY?editors=001
上面的示例包括带有'videoautplay'特征检测的Modernizr 3(http://v3.modernizr.com/download/#-videoautoplay) .
也许这将有助于像我这样的未来的谷歌 - 这个功能创建/删除视频并测试它是否可以自动播放 . 然后它将全局变量“autoplay”设置为true或false . 它测试MP4和webM的兼容性,但是如果需要的话,添加更多内容并不困难(只需要64位编码并附加另一个源) . “可接受的延迟”变量是指设备开始播放测试视频的合理时间 . 有限带宽/处理的组合有时使用回退(非自动播放)解决方案是有意义的,即使支持自动播放也是如此 . 我通常使用100毫秒 .
据我所知,Modernizr和Dive into HTML5’s detection guide都不知道如何检测是否支持
autoplay
. (虽然Modernizr’s “Undetectables” page也没有列出autoplay
. )我弹出了a test page,它警告新创建的
<audio>
元素上autoplay
属性的值,iOS 4.3上的Safari和Mac OS X上的Chrome 13都返回false
(而不是undefined
,这是IE 6返回的内容) .所以,不幸的是,你最好的选择可能是采用浏览器检测,并维护自己的浏览器支持
autoplay
列表 .这是一个替代解决方案,它使用回调和会话存储来测试HTML5视频自动播放支持 . 一旦执行测试并且存在会话存储,则在下一个会话之前不会再次执行检查 . 每次页面加载时都可以节省运行时间 . 它使用base64'd 1秒空白视频剪辑来测试自动播放支持 .
https://gist.github.com/nathansearles/271870d4100f0f045c5c
上面的脚本和Modernizr检测不可靠的原因可能是它们没有通过Apple所做的所有限制:
视频 must be 静音
视频 must 设置为内联播放
视频 must have 大小(0x0 px将失败)
视频 must be 在视口中可见(无不透明效果,显示:无或可见:隐藏)
我想出了一个小的jQuery插件来检测自动播放 . 看看它是否更可靠:
你可以像这样使用它:
我意识到这是一个视频问题 - 它也适用于音频 .
我已经构建了一个音频测试,打算用
Modernizr.addTest()
将它加载到Moderizr中 .结果令人惊讶,并且非常依赖于平台和系统状态 . 事实证明,有几种支持自动播放的Android浏览器 . 谁知道 .
通过观察GitHub,我想Modernizr的家伙会比我更可靠,更优雅地计算出这一切 - 如果他们没有't already. It seems to boil down to timing. You'认为浏览器家伙会在这里给我们留下一块骨头 . 也许他们会 .
无论如何,这里是jsfiddle链接:Audio().autoplay test .
虽然在jsfiddle示例中有绒毛代码,但这是核心:
虽然我没有看到一个上面有一个
setTimeout
(Modernizr人员谈论它),但是这个代码有几个版本 . 我想我会相信Peter Coles . 也许他的版本不太可能遭受时间问题 .Modernizr自动播放测试有一些可靠性问题,如下所示:https://github.com/Modernizr/Modernizr/issues/1095
您可以通过检查视频元素的暂停状态在以编程方式播放后是否发生更改来检测视频自动播放支持 . 仅此一项可以在某些移动浏览器中返回漏报,因此应添加Promise检查以覆盖这些漏洞 .
此方法适用于所有主流浏览器(桌面和移动设备),但Android <= 4.0和Windows Phone除外,它返回假阴性 .
这是检测功能:
用法:
现场测试:https://codepen.io/paulorely/pen/QveEGy
也许我的回复有点迟,但我只是测试了一个对我来说很好的解决方案:
setTimeout不是很干净,但整体解决方案非常简单!
可能是你发现它很有用 . 我将此线程中建议的所有注释合并到此解决方案中:https://github.com/kaufguy/autoplay-detector
在这里演示:https://kaufguy.github.io/autoplay-detector/
我也限制它只用于内联播放 .
对我有用......