H5 播放视频常见bug及解决方案
本文摘自:本文来自“小时光茶社(Tech Teahouse)”公众号
原文:https://mp.weixin.qq.com/s/MM5ZwCiWLAeHalsNYMImnw
1. 自动播放问题
通过autoplay属性
视频的自动播放需要在video标签上添加autoplay属性, 如:
<video autoplay><video/>
但是在很多浏览器里,如iOS下并不支持这个属性,在iOS下必须给webview设置:
self.wView.allowsInlineMediaPlayback = YES;self.wView.mediaPlaybackRequiresUserAction = NO;
才能让这个属性生效从而让用户一进入页面就开始视频的自动播放。
通过直接调用video.play()方法
在一些情况下我们想加入一些判断逻辑,如判断用户网络环境,在wifi下自动播放,在4g环境下给出提示,这中情况下就适合直接选中video并调用video.play来播放视频;
但是这种情况下也需要webview的支持,如在手Q下可以做到直接调用,在微信下因为不允许视频直接播放,则必须通过用户的真实操作来触发调用 video.play() 这就是各种微信的h5活动页面需要引导用户进行一下点击操作才开始的原因。
同时发现真实点击必须使用触发 touchend、click、doubleclick 或 keydown 事件等标准的事件才能触发,使用Zepto封装过的tap事件并不能触发播放器的播放;
2. 页面内联播放问题
在iOS Safari和一些安卓的一些浏览器下播放视频的时候,不能在h5页面中播放视频,系统会自动接管视频;
如果需要在h5页面内播放视频,需要在视频标签上加上 webkit-playsinline ,在iOS10以后,需要加上 playsinline ,建议同时加上这两个属性,同时需要app支持这种模式,手Q和微信都支持这种模式;
3. 视频的高度问题
在安卓下,一些浏览器如QQ浏览器和UC浏览器,系统会把视频的层级调到最高,所以如果想在页面上显示dom元素,都会被视频盖住,单纯的设置该dom的z-index是无效的;
解决方案:
1.在弹出会显示在视频上方dom的时候暂停视频播放
2.将视频所在的dom的父元素的高度设为1
3.处理完弹出的事件后将视频所在的父元素高度还原
4. 视频的默认播放图标
在iOS下会有一个默认的播放图标,如图所示:

在iOS都会默认显示,不能通过js控制,但是可以通过css样式将其隐藏
video::-webkit-media-controls-start-playback-button {
display: none;
}
5.视频的刷新
我们知道video暴露了play和pause方法来提供视频的播放和暂停,但是h5没有标准的刷新方法,如果我们想实现视频的刷新,则需要通过js实现
var player = $('#player')[0];
player.load();
setTimeout(function () {
player.play();
})
6.视频的全屏问题
(1)全屏API
h5暴露了一个webkitRequestFullScreen方法,可以让每个dom都请求全屏,当然video标签也可以使用。
但是在测试中发现,一些安卓机不支持该属性,如小米手机,所以需要在调用的时候进行一下判断
var player = $('#player')[0];if (player.webkitSupportsFullscreen) {
player.webkitEnterFullscreen();
} else {
player.webkitRequestFullScreen();
}
(2)系统接管播放
我们上边说道调用h5的webkitRequestFullScreen方法来进入视频的全屏,那么这个方法会使浏览器完全接管视频播放,如图所示

这种接管的后果是这时的我们是没有办法控制视频的播放,也没有办法在上面浮动我们的dom元素,如弹幕,礼物这些,会完全被视频盖在下面,所以我们的目标即是解决这种系统接管的问题
(3)使用伪全屏(样式全屏)
样式全屏的核心是设置video标签的宽高,使其撑满整个webview,看上去像全屏一样但是因为视频一般都是16:9的宽高比,所以在竖屏情况下不能很好的做到铺满整个屏幕

而一般用户进入页面基本都是竖屏,所以我们就要考虑怎么让用户在竖屏点击全屏按钮时,能体验到像终端app一样自动进入横屏全屏的体验,下面有两种方案:
1.在用户点击全屏时候,通过css3属性旋转屏幕
通过css的transform,我们可以把dom元素旋转显示通过 -webkit-transform: rotate(90deg) 并设置video的高度为当前webview的宽度,video的宽度为当前webview的高度来实现旋转全屏。
这种模式的显示没有太大问题,但因为是通过css控制的页面dom显示,对于原生的空间不能很好的控制,如系统的键盘

在拉起键盘输入弹幕的时候,键盘不受控制还是竖屏显示了如果页面不涉及与原生组件的交互,那么这种方案是一种很可行且兼容性比较好的方案
2.用户在点击全屏时,通过js api来控制webview旋转横屏
在手Q里,我们和终端的同学合作添加了控制webview横竖屏的接口
在用户点击全屏的时候,先判断当前是否横屏
/*
* 是否横屏
*/
function isHorizontal() {
if (window.orientation != undefined) {
return (window.orientation == 90 || window.orientation == -90);
} else {
return window.innerWidth > window.innerHeight;
}
} //设置webview为横竖屏
mqq.ui.setWebViewBehavior({
orientation: 0 //0是竖屏,1是横屏
});
如果是竖屏则强制webview旋转进入横屏,同时监听页面的resize方法,页面横竖屏变化的时候会触发这个方法,在这个方法里再动态的调整video的宽高来铺满整个屏幕
如果发现在x5内核下无法使用伪全屏而被浏览器接管,可以咨询下x5同事为你的域名开启白名单,不接管你域名下的视频播放
现在的h5的播放还有很多的表现和兼容性的问题,希望这份指南可以帮你在遇到同样的坑时能尽快爬出来,并优化你的h5播放体验,吸引到更多的用户
H5 播放视频常见bug及解决方案的更多相关文章
- CSS控制之IE常见BUG及解决方案
常见bug 解决方案 盒模型bug 使用严格doctype声明 双倍margin bug _display:inline; 不认识a:link 不加:link 3像素margin bug 规范浮动与清 ...
- 常见bug及解决方案
1.外边距叠加 一.发生在一个div内 <!DOCTYPE> <html> <head> <meta http-equiv=Content-Type cont ...
- h5嵌入视频遇到的bug及总结
最近做的一个h5活动因为嵌入视频而发现了好多以前从未发现的问题,在测试的时候不同系统不同版本不同环境等多多少少都出现了些问题,搞得我也是焦头烂额的,不过好在最终问题都解决了,自己也学到了好多东西,为了 ...
- h5嵌入视频遇到的bug及总结---转载
最近做的一个h5活动因为嵌入视频而发现了好多以前从未发现的问题,在测试的时候不同系统不同版本不同环境等多多少少都出现了些问题,搞得我也是焦头烂额的,不过好在最终问题都解决了,自己也学到了好多东西,为了 ...
- 手机浏览器自动播放视频video(设置autoplay无效)的解决方案
1.问题的提出 某一天接了个需求,需要在手机的H5页面内加入视频,我开开心心做完,准备交付的时候,问题来了,PM想要用户一进入页面,视频就开始播放,不需要用户手动点击. 2.尝试解决 加autopla ...
- jquery博客收集的IE6中CSS常见BUG全集及解决方案
今天的样式调的纠结,一会这边一会那么把jquery博客折腾的头大,浏览器兼容性.晚上闲着收集一些常见IE6中的BUG 3像素问题及解决办法 当使用float浮动容器后,在IE6下会产生3px的空隙,有 ...
- H5播放器内置播放视频(兼容绝大多数安卓和ios)
关于H5播放器内置播放视频,这个问题一直困扰我很长一段时间,qq以前提供白名单已经关闭,后来提供了同层属性的控制,或多或少也有点差强人意. 后来一次偶然发现一个非常简单的方法可以实现. 只需要给vid ...
- Android:webView加载h5网页视频,播放不了,以及横屏全屏的问题和实现自定义加载进度条的效果
1.webView加载h5网页视频,播放不了,android3.0之后要在menifest添加硬件加速的属性 android:hardwareAccelerated="true". ...
- IE6中CSS常见BUG全集及解决方案——摘自网友
IE6中CSS常见BUG全集及解决方案 IE6双倍边距bug 当页面内有多个连续浮动时,如本页的图标列表是采用左浮动,此时设置li的左侧margin值时,在最左侧呈现双倍情况.如外边距设置为10px, ...
随机推荐
- Cognos组织架构介绍
Cognos只是一个工具,说到Cognos相信大部分人都知道BI(商业智能,Business Intelligence). Cognos也是属于SOA架构,面向服务的体系结构,是一个组件模型,它将应用 ...
- phpcms v9表单实现问答咨询功能
本文转自别人 phpcms v9的留言板插件可以安装留言板,做问答咨询,那样的话有很多东西需要修改,也有人发现phpcms v9有个表单向导功能,只能留言,不能回复,今天仿站网:新源网络工作室告诉大家 ...
- flex布局,input点击软键盘激活,底部按钮上移
安卓手机的问题,原本表单没有超出一屏的时候,上移的现象也是存才的,只是需要滑动body才能看得到,现在,超出一屏了,现象就很明显了 body明显上移: 点击input修改价格: 软键盘出现: 先尝试了 ...
- android 开发 - 结束所有activity
每一个activity都有自己的生命周期,被打开了最终就要被关闭. 四种结束当前的activity方法 //关闭当前activity方法一 finish(); //关闭当前界面方法二 android. ...
- html的table列表根据奇数还是偶数行显示不同颜色
<tr <s:if test="#sts.even"> class="table_1" onMouseOut="this.class ...
- 基于Consul+Upsync+Nginx实现动态负载均衡
基于Consul+Upsync+Nginx实现动态负载均衡 1.Consul环境搭建 下载consul_0.7.5_linux_amd64.zip到/usr/local/src目录 cd /usr/l ...
- springMVC的HandleMapping
http://blog.chinaunix.net/uid-20415521-id-1949916.html SpingMVC中的HandlerMapping (2007-05-22 11:33) 分 ...
- 反编译apk + eclipse中调试smali
1.对apk使用apktool反编译出可调试的smali代码到out文件夹 apktool -d d 定点加粉丝_com.mingniu.wxddjfs_440.apk -o out 这里必须使用-d ...
- php和jsCOOKIE实现前端交互
w如何精简? <script> document.cookie = 'wjs_cookie=' + 'amz_reviews'; function w(id) { document.coo ...
- datetime 模块详解 -- 基本的日期和时间类型
转自:https://www.cnblogs.com/fclbky/articles/4098204.html datetime 模块提供了各种类用于操作日期和时间,该模块侧重于高效率的格式化输出 在 ...