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的更多相关文章

  1. 大事记 - 安卓微信浏览器 video 标签层级过高

    // 为什么叫<大事记>? // 以前总有面试官问这样一个问题:“你在项目中遇到过最头疼的问题是什么,是怎么解决的?” // 当时总觉得,已解决的问题都算不上头疼,所以回答总是不尽人意. ...

  2. html中如何移除video下载按钮

    我发现部分安卓手机使用video标签播放视频的时候会自带一个下载按钮,一般产品大多都不需要这一功能,那如何屏蔽下载按钮呢?有下面两种,请一定使用第一种方式,使用css控制会有兼容性问题,建议不要使用这 ...

  3. X5内核浏览器video自动全屏解决办法-canvas

    最近在做手机端上面播放视频的项目,但是在安卓上面,video的播放是脱离页面,置于最顶层的,所以带来了很多问题,为了解决这个问题,查看了多方资料,写了下面简单的demo,方便以后使用. 下面就是运用c ...

  4. 解决微信浏览器内video全屏问题

    前端离职,让我写个视频播放页面,木办法只有我来搞了. 默认用h5的 video标签 测试时候发现微信浏览器内访问video自动全屏播放. 搜了下 webkit-playsinline="tr ...

  5. 用javascript做一个视频播放器

    以前我们在网页上播放视频,都是要麻烦flash来实现.看着那一大段的<object>真心觉得累.随着html5的不断普及,现在是时候使用html5提供的video元素来做点正经事了,但是要 ...

  6. 江湖问题研究-- intent传递有没有大小限制,是多少?

    出门一步,便是江湖,江湖上有许多流言. 比如这条: intent传递是有大小限制的,具体在40KB左右. 当然也有传言说是1M左右. 数百头母驴为何半夜惨叫? 小卖部安全套为何屡遭黑手? 女生宿舍内裤 ...

  7. android开发学习笔记系列(2)-android应用界面编程

    前言 本篇博客将会简要介绍andriod开发过程中的一些界面元素和编程的实现,我将大家走进安卓的XML世界,当然可能会涉及到java代码,当然本文主要是介绍XML文件的界面布局. 那么我们的XML存在 ...

  8. 江湖问题研究-- intent传递有没有限制大小,是多少?

    出门一步,便是江湖.江湖上有很多流言. 比方这条: intent传递是有限制大小的,详细在40KB左右. 当然也有传言说是1M左右. 数百头母驴为何半夜慘叫? 小卖部安全套为何屡遭黑手? 女生宿舍内裤 ...

  9. APICloud开发小技巧(一)

    apicloud开发文档中,前端开发框架指的就是,类似jq\js的语法: https://docs.apicloud.com/Front-end-Framework/framework-dev-gui ...

随机推荐

  1. Android搞事篇——使用Intent跳转界面

    跳转页面基本分为三个步骤: 1.初始化一个intent:(一个intent就够用了): 2.传入intent参数: 3.调用startactivity();实现跳转页面 具体操作如下 首先你需要一个项 ...

  2. 干货 | 云智慧透视宝Java代码性能监控实现原理

    这篇图文并茂,高端大气上档次,思维缜密的文章,一看就和我平时的风格不同.对了.这不是我写的,是我家高大英俊,写一手好代码,做一手好菜的男神老公的大作,曾发表于技术公号,经本人授权转载~~ 一.Java ...

  3. LoadRunner11_录制Oracle数据库脚本

    [oracle环境] ①oracle:无需在本地安装oracle,但是oracle的odbc驱动一定要装:(我的安装路径为 D:\oracle ).安装好后在环境变量 " Path &quo ...

  4. 2017最新xcode打包APP详细图文

    网上的xcode打包ipa教程大多太旧而且又不完整,所以整理了一个最新的完整详细的xcode打包APP的图文教程分享给小白到大神路上前进的你我. xcode打包IPA包之前先申请iOS证书,然后导入证 ...

  5. 如何离线安装Visual Studio 2017

    1. 官方下载在线安装文件 vs_community.exe https://www.visualstudio.com/zh-hans/thank-you-downloading-visual-stu ...

  6. mkdirs自动创建文件夹

    //保存路径 如file路径是E:\filer\a.jpg File toSaveFile=new File("filePath"); if(toSaveFile!=null){ ...

  7. Flash TextField selectable bug block TextEvent.Link solution

    There is an old version Felx SDK bug(in my case it's Flex SDK v3.3.0.4852) that when TextField.selec ...

  8. Linux下pecl命令无法执行的解决

    pecl install swoole 提示如下错误:bash: pecl: command not found执行yum install php-pear生效

  9. 【LeetCode】60. Permutation Sequence

    题目: The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of t ...

  10. jQuery(二) jQuery对Ajax的使用

    学习使我快乐!嘿 --WH 一.jQuery使用Ajax 想要了解jQuery如何使用Ajax,并且体会到它所带来的方便性,那么就得了解原始的Ajax是如何编写的,是怎样的繁琐,然后和Jquery的代 ...