走进安卓的重灾区----video
html5的video已经出来很久了。在ios上使用基本上没什么毛病,但是安卓下就是一个重灾区了,各种体验差。这几天搞了安卓的兼容,简直是要吐血。所以特意总结了一些强势的坑点。
先看一下常用的一些属性和方法:
video.error // null正常
video.error.code // 1用户终止 2网络错误 3解码错误 4URL无效
video.currentTime // 当前播放的位置,赋值可改变位置
video.duration // 当前资源长度,流返回无限
video.paused // 是否暂停
video.ended // 是否结束
video.autoPlay // 是否自动播放
loadstart // 客户端开始请求数据
error // 请求数据时遇到错误(可以通过上一页的属性video.error.code查看具体错误原因)
play // 开始播放时触发
pause // 暂停时触发
loadeddata // 数据已加载
waiting // 等待数据,并非错误
playing // play触发后执行一次
canplaythrough // 可以播放,已加载好
timeupdate // 播放时间改变
durationchange // 资源长度改变
...
再看看坑(本次主要是在微信X5浏览器中的测试,其他安卓浏览器下表现不一定一致):
1.自动播放
在ios上会自动全屏播放,需要在video标签上设置一个属性webkit-playsinline,ios10及以上版本属性名改成playsinline。安卓上,无法自动播放,必须手动触发视频的播放。调用任何方法都没用,据说这个为了帮用户省流量而设定的。但是安卓在首次触发之后,再次触发可以通过调用.play来触发播放视频。因此做兼容的时候可以设一个判断是否首次播放的标志来处理。
2.默认样式
安卓下,不能自动播放,因此视频在播放前会带有视频的默认白色加圆圈播放按钮且背景是纯黑色,可以说是非常丑陋了。为了好点的用户体验就是可以在视频的最上层覆盖一张引导用户点击播放视频的引导图,这样既不丑陋又让用户知道这里需要点一下才有东西出现。我的做法是增加一个手指引导图,然后让改元素可穿透(即设置pointer-events:none;让其不会成为任何鼠标事件的target),这样点击元素的时候就相当于点击了视频播放。然后监听playing事件,如果视频开始播放了则把引导图隐藏。具体如下:
<div class="entry_video" id="entry_video">
<video class="entry_video_con" id="video" webkit-playsinline playsinline src="//wq.360buyimg.com/fd/h5/1707/entryvideo/images/meirenyu_7f7e46da.mp4" autoplay="true"></video>
<div class="guide" style="width: 100%;height: 100%;top: 0;left:0;position: absolute;pointer-events:none;">
<img src="//img11.360buyimg.com/jdphoto/s750x1334_jfs/t5668/219/7883436652/42409/2a1e4cc0/5976a71bN212dfa7b.png" alt="" style="width:100%;height:100%;pointer-events:none;">
</div>
</div>
vi.addEventListener('playing',function(){
$('.guide').hide();
})
3.全屏播放
若页面中没有其他内容,只是播放一个视频的话,这个问题很好处理。设置webkit-playsinline,如果是在X5内核浏览器的话,设置x5-video-player-type="h5" x5-video-player-fullscreen="true"。那么问题来了,如果页面上不只有视频,还有其他内容呢,例如视频是在一个弹出层中。这样设置的话,页面原有内容会有一个1s左右的非常明显拉伸过程,这个拉伸过程就是为全屏播放视频做准备的。但是这样的体验可以说是非常糟糕了。于是这种情况下,必须舍弃设置全屏播放了,但是在X5浏览器非全屏播放模式下,安卓会在视频页面右上角自动生成一个全屏按钮,这个怎么都去不掉。若用户点击了进入全屏模式,视频播放完毕并不会停留在视频最后一帧,而是出现腾讯的一些视频推送,你懂的。这个时候退出了全屏播放的话,视频会自动隐藏,所以最好做一张视频底图,不然就尴尬了。
4.x5下检测全屏
vi.addEventListener("x5videoenterfullscreen", function(){
//进入全屏
});
vi.addEventListener("x5videoexitfullscreen", function(){
//退出全屏
});
用video.addEventListener("x5videoexitfullscreen", function(){….});可以检测到视频什么时候退出了全屏,但是若在这个监听到退出之后隐藏整个视频,则再次触发播放视频事件失效。且在这个监听中直接调用.play方法并不能使视频重新播放。也就是说在检测过程中不能对视频进行一些隐藏,删除的操作。可以说,这检测也没什么意义了。
5.诡异的坑
安卓下,若是摇一摇在弹出层播放视频,若弹出层中有外链,点击了跳转,再返回,这个时候video会有一个诡异的bug,具体表现为返回后第一次能正常触发,第二次之后触发都直接播到视频最后一帧,设置currentTime、start为0再播放,或者先pause再play都没有用,必须销毁重建。
6.由于video在ios下表现良好,所以做兼容的时候,可以通过userAgent来做分别做处理。如:
var vi = document.getElementsByTagName('video')[0];
var ua = navigator.userAgent;
if(ua.indexOf('iPhone') <= -1){
shakeWrap.show();
if(!firstVideoLoad){
vi.currentTime = 0;
vi.start = 0;
vi.play();
}
vi.addEventListener('playing',function(){
firstVideoLoad = false;
$('.guide').hide();
})
}else{
vi.play();
}
}
7.微信固定入口的一些奇特bug
①.必须要等到微信的jsbridge ready了才能触发.play,否则不会自动执行。
document.addEventListener("WeixinJSBridgeReady", function() {
$("#video")[0].play();
});
②在固定入口内,且jsbridge ready了,如果使用摇一摇,也无法触发.play。需要在摇一摇之前预先加载如下:
document.addEventListener("WeixinJSBridgeReady", function() {
var vi = document.getElementsByTagName('video')[0];
vi.load();
vi.pause();
window.addEventListener('devicemotion', deviceMotionHandler, false);
});
这种情况,与第五点是相悖的,也就是说如果要在摇一摇之前预加载,就做不到页面跳出之后返回可以重建video。也就是说,摇一摇播视频一定存在跳出页面再返回的时候,video变得诡异,播放不正常的问题。目前,这个bug我还没有办法解决。
③微信固定入口在没有使用jsbridge,而是通过点击来播放的点击事件,只能是click事情,不能是touchstart事件。
走进安卓的重灾区----video的更多相关文章
- 大事记 - 安卓微信浏览器 video 标签层级过高
// 为什么叫<大事记>? // 以前总有面试官问这样一个问题:“你在项目中遇到过最头疼的问题是什么,是怎么解决的?” // 当时总觉得,已解决的问题都算不上头疼,所以回答总是不尽人意. ...
- html中如何移除video下载按钮
我发现部分安卓手机使用video标签播放视频的时候会自带一个下载按钮,一般产品大多都不需要这一功能,那如何屏蔽下载按钮呢?有下面两种,请一定使用第一种方式,使用css控制会有兼容性问题,建议不要使用这 ...
- X5内核浏览器video自动全屏解决办法-canvas
最近在做手机端上面播放视频的项目,但是在安卓上面,video的播放是脱离页面,置于最顶层的,所以带来了很多问题,为了解决这个问题,查看了多方资料,写了下面简单的demo,方便以后使用. 下面就是运用c ...
- 解决微信浏览器内video全屏问题
前端离职,让我写个视频播放页面,木办法只有我来搞了. 默认用h5的 video标签 测试时候发现微信浏览器内访问video自动全屏播放. 搜了下 webkit-playsinline="tr ...
- 用javascript做一个视频播放器
以前我们在网页上播放视频,都是要麻烦flash来实现.看着那一大段的<object>真心觉得累.随着html5的不断普及,现在是时候使用html5提供的video元素来做点正经事了,但是要 ...
- 江湖问题研究-- intent传递有没有大小限制,是多少?
出门一步,便是江湖,江湖上有许多流言. 比如这条: intent传递是有大小限制的,具体在40KB左右. 当然也有传言说是1M左右. 数百头母驴为何半夜惨叫? 小卖部安全套为何屡遭黑手? 女生宿舍内裤 ...
- android开发学习笔记系列(2)-android应用界面编程
前言 本篇博客将会简要介绍andriod开发过程中的一些界面元素和编程的实现,我将大家走进安卓的XML世界,当然可能会涉及到java代码,当然本文主要是介绍XML文件的界面布局. 那么我们的XML存在 ...
- 江湖问题研究-- intent传递有没有限制大小,是多少?
出门一步,便是江湖.江湖上有很多流言. 比方这条: intent传递是有限制大小的,详细在40KB左右. 当然也有传言说是1M左右. 数百头母驴为何半夜慘叫? 小卖部安全套为何屡遭黑手? 女生宿舍内裤 ...
- APICloud开发小技巧(一)
apicloud开发文档中,前端开发框架指的就是,类似jq\js的语法: https://docs.apicloud.com/Front-end-Framework/framework-dev-gui ...
随机推荐
- Coursera 机器学习笔记(七)
主要为第九周内容:异常检测.推荐系统 (一)异常检测(DENSITY ESTIMATION) 核密度估计(kernel density estimation)是在概率论中用来估计未知的密度函数,属于非 ...
- html打造动画【系列1】- 萌萌的大白
每个人心中都有一个暖暖的大白,blingbling的大眼睛~软软的肚子~宽厚的肩膀~善良的心肠~如果可以,我愿意沦陷在大白的肚子里永远不出来,哈哈~毛球要失宠咯~ 哈哈哈 每个人都是独立的个体,大白也 ...
- javaCV开发详解之5:录制音频(录制麦克风)到本地文件/流媒体服务器(基于javax.sound、javaCV-FFMPEG)
javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...
- 请教 C# 异步 async await 问题
各位园友,之前对C#异步只是肤浅了解,请教一个具体问题. 需求: 前台会发送一个Array,这个数组都是 id的集合,比较大.分两步,首先保存这些id,然后去调用异步方法. 可以正常返回json,也可 ...
- html5-表格的建立
用表格显示信息调理清楚,使浏览者一目了然.表格在网页中还有协助布局的作用,可以把文字.图像等组织到表格的不同行列.那么,接下来我将讲解一下表格的常用属性. 首先,表格命令 表格的行:tr 每行中的列 ...
- spring非controller类获取service方法
ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml"); pushMessageServ ...
- 懵懂oracle之存储过程2
上篇<懵懂oracle之存储过程>已经给大家介绍了很多关于开发存储过程相关的基础知识,笔者尽最大的努力总结了所有接触到的关于存储过程的知识,分享给大家和大家一起学习进步.本篇文章既是完成上 ...
- Bash中的数学扩展
Bash只支持整数运算,不支持浮点运算.如果需要进行浮点运算,需要使用bc程序.Bash中的数学扩展有两种形式:$[ expression ]或$(( expression )) 例子:$echo $ ...
- python 中 for 循环 if循环 break
python中最基本的语法格式大概就是缩进了.python中常用的循环:for循环,if循环.一个小游戏说明for,if ,break的用法. 猜数字游戏: 1.系统生成一个20以内的随机数 2.玩家 ...
- C#中的Dictionary的使用
在工作中有时候会用到Dictionary,由于自己之前没用过,参考了一下前人和先辈的实践,仿照着写了一个Test,第一次用还不是很熟练,要多实践练习才能用的得心应手,写代码重在敲键盘,以此为诫.(主要 ...