html5中video在安卓与ios实际应用中遇到的问题及解决

栏目: Html5 · 发布时间: 5年前

内容简介:昨天公司指派给我了一个任务,是关于视频播放后展示页面的单页应用,具体需求如下:看起来是不是特别简单粗暴,乍一看好像也是就是不到一小时的工作量,却让我足足熬到了深夜两点钟,说起来都是泪~~。这期间遇到了不少问题,我都会在下面一一列举(以下所说的浏览器均为移动端浏览器,不再一一标注)。在我开发完基本代码之后,push到githook上在手机上展示时,遇到了第一个问题:

昨天公司指派给我了一个任务,是关于视频播放后展示页面的单页应用,具体需求如下:

  1. 用户在进入页面后视频开始自动播放,期间不得操作;

  2. 视频播放完成后顺滑切换到主体页。

看起来是不是特别简单粗暴,乍一看好像也是就是不到一小时的工作量,却让我足足熬到了深夜两点钟,说起来都是泪~~。这期间遇到了不少问题,我都会在下面一一列举(以下所说的浏览器均为移动端浏览器,不再一一标注)。

一、video的默认显示

在我开发完基本代码之后,push到githook上在手机上展示时,遇到了第一个问题:

众所周知,html中video的autoplay在移动端浏览器上基本失效(其一,移动端要有用户交互才能触发事件,如click、touch;其二,ios协议蜂窝数据下不得开启音视频的自动播放),所以我在加载后取巧的加了一个悬浮播放图标,引导用户点击开始业务流程。

但可能因为内核不同,在微信浏览器/safari/chrome上默认展示的poster各有不同,chrome应用了默认行为截取了视频第一帧作为显示,微信浏览器和safari却显示空白,效果就是孤零零的播放图放在一张白纸上。解决方案是:通过canvas截取视频第一帧作为默认显示的图片:

    var cut = function() {
        let canvas = document.createElement("canvas");//创建画布
        canvas.width = video.videoWidth * scale;
        canvas.height = video.videoHeight * scale;//设定宽高比
        canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height);//将视频此刻帧数画入画布
        let img = document.createElement("img");
        img.src = canvas.toDataURL("image/png");
        Dom.appendChild(img);//写入到Dom
    };
    video.addEventListener('loadeddata',cut);//在视频帧数已加载时执行截取

二、video控制栏的隐藏

html文档里写有,如果controls属性不出现,则默认不显示,但其实在实际应用中,浏览器一般都是调用默认播放器进行播放,再加上双端差异,实际展示效果更是精彩纷呈。说到这里,要写一下目前各个浏览器的内核情况:

微信浏览器

  • 安卓

微信6.1版本以上的android用户,都是使用的QQ浏览器的X5内核。

5.4-6.1之间的版本,若用户安装了QQ浏览器就是使用的X5内核,若用户未安装浏览器,使用的是系统内核。

  • IOS

Webkit。

大部分手机浏览器

Webkit。(UC的U3内核和X5内核一样,是基于webkit修改的内核)。

由上可知,在移动端开发遇到的百分之九十的问题,都是系统和机型问题。

我们回到问题本身,在使用htmlvideo标签时,我们会发现,点击播放之后首先会进入播放器占用整个屏幕,之后开始播放,再次点击视频会出现控制栏。

好,捋一捋思路。第一步,要解决脱离屏幕的播放问题。

webkit-playsinline playsinline:这个属性作用是让视频播放时局域播放(不全屏,在原有位置上播放),不脱离文档流 。但这个属性需要嵌入网页的APP比如WeChat中UIwebview 的allowsInlineMediaPlayback = YES webview.allowsInlineMediaPlayback = YES,才能生效。换句话说,安卓不支持,而IOS的wechat却支持,因为APP不支持playsinline,所以安卓是默认全屏播放的。

第二步,隐藏掉控制栏。

x5-video-player-type='h5' 启用同层H5播放器,学名叫沉浸式播放。播放的时候除去了control和微信的导航栏,只留下"X"和"<"两键。

一般来说,这种已经足够‘沉浸’了,但项目对定制化要求比较高,要求这种也不要出现。我苦思冥想,查了好多文档,方法却都大同小异。直到最后灵光一闪,放弃了通过属性或方法来限制的思路,决定用视觉遮挡来实现效果:

将video的控制栏挤出可视区域,不就相当于隐藏了控制栏嘛。

/*这是CSS*/
html,body,.main{
width: 100%;
height: 100%;
overflow: hidden;//隐藏
background: #FFF;
box-sizing:border-box;
}
.videobox{
z-index: 12;
position: fixed;
left: 0;
top: 0;
width: 100%;
height: 100%;
}
#video{
position: absolute;
top: -2%;
width: 100%;
height: 110%;
}



<div class="videobox" ontouchmove="return false;">
<video poster="img/test.jpg" webkit-playsinline="true" playsinline x5-video-player-type="h5" x-webkit-airplay="true" id="video">
<source src="img/movie.mp4" type="video/mp4">
<source src="img/movie.ogg" type="video/ogg">
您的浏览器不支持该视频格式。
video>
div>

这样就实现了播放时不得操作的需求。

三、IOS当视频被打开在safari浏览器时播放白屏。

这就牵扯到两个个问题,我们分开来说。

video标签对视频格式以及编码的支持

  • MPEG4 = 带有H.264视频编码和AAC音频编码的MPEG4文件

  • WebM = 带有VP8视频编码和Vorbis音频编码的 WebM文件

  • Ogg = 带有Theora视频编码和Vorbis音频编码的Ogg文件

如上所示,只有h264编码的MP4视频(MPEG-LA公司)、VP8编码的webm格式的视频(Google公司)和Theora编码的ogg格式的视频(iTouch开发)可以支持html5的


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Lua设计与实现

Lua设计与实现

codedump / 人民邮电出版社 / 2017-8 / 49.00元

本书首先介绍了Lua中的数据结构,比如通用数据是如何表示的、Lua的字符串以及表类型的实现原理,接着讨论了Lua虚拟机的实现,并且将其中重点的一些指令进行了分类讲解,最后讨论了垃圾回收、模块实现、热更新、协程等的实现原理。一起来看看 《Lua设计与实现》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

html转js在线工具
html转js在线工具

html转js在线工具