当前位置: 首页 > Web前端 > HTML5

html5--移动端视频video的android兼容,去除播放控件、全屏等

时间:2023-04-05 17:54:52 HTML5

html5--安卓兼容手机视频视频,去掉播放控件,全屏等经验。但在故宫穿越H5,吴亦凡入伍H5之前,所采用的视频技术似乎给人一种耳目一新的感觉。前段时间在做某个项目,恰好是一个全屏视频。给大家分享一下我经历过的坑以及填坑的方法。ios端的问题其实没什么,基本都是android端的,基本上每个有视频的项目都会遇到。当然,有特殊需要另议。问题主要有几个方面:全屏处理;自动播放;播放控制;隐藏播放控制;视频全屏处理其实也不难,只要在video标签中添加一个webkit-playsinline属性即可,这个属性在基于webkit内核的移动端基本没问题,这个全屏不是全屏,它是浏览器窗口中的全屏,而不是占据整个手机的全屏,当然我们web端需要的是文档正文中窗口范围内的全屏。ios下,嵌入视频并加载媒体元数据后,全屏显示,或者加一张海报,可以看到图片。但是在android下,大部分机器不显示视频画面,或者显示非全屏的黑色播放控件,即使加个海报封面也无济于事。因为海报不兼容android,所以最好在视频上层加个div来传图。这种比较好的处理方式应该是:在视频上加一层div作为封面。由于android不允许在视频上层放东西,所以先把视频设置为width:1px。播放完毕,去掉上层的覆盖物,width:100%或者你想要的宽度。视频自动播放我就不多说了。相信大家和我一样,都在努力寻找Android,可以在页面加载完成后自动播放,但现实是残酷的。安卓下是不允许自动播放的,就算你用。video.play()也是不可接受的。必须有来自用户的主动触发,例如触摸屏幕,并生成点击或触摸事件。不知道以后android会不会改进,但至少现在不行。更好的方式是引导用户触发、滑动或触摸,然后调用video.play()播放,给用户一种自动播放的错觉。视频播放的控制对于视频或音频等媒体元素,有一些方法,常用的有play()、pause();还有一些事件,比如'loadstart','canplay','canplaythrough','ended','timeupdate'.....等等。移动端需要注意一些陷阱。不要轻易使用'ended'和'timeupdate'以外的媒体元素的event事件。不同的机器可能会出现不同的情况,例如:在ios下监听'canplay'和'canplaythrough'(是否缓冲了足够的数据可以流畅播放),加载时不会触发,即使preload="auto"是没用,但是在pc和android的chrome调试器下,会在loading阶段触发即可。ios只有播放后才会触发。总之,目前的视频标准并不完善,需要注意的陷阱也很多。最好在使用前亲自测试一下。关于控件的问题我还要说一点,就是android在播放视频的时候会有一个控件初始化的过程。当全屏视频想要伪装成非视频时,是我们不愿意看到的。我的解决办法是这样的:当我们需要播放的时候提前初始化,也就是在播放之前设置width:1px;然后play(),这样视频就已经播放完毕并初始化了。那么当你需要再玩的时候,再play()的时候就不会发生了,控件会拉伸。“去掉”android下的播放控制栏才是重头戏。相信这个问题已经困扰了无数前端开发者。在搜索这个问题的解决方案时,几乎所有的文章都告诉你,在android下,播放器控件是不能走的。其实好像是这样,但是看了故宫穿越H5和吴亦凡的H5,你会发现android下没有控制栏。当初看到那些H5视频的时候,并没有看出他们的内容有多新颖,传播的有多广。第一次测试android下的兼容性问题,发现没有出现控制栏。研究了半天没成功,在一个技术贴里看到:因为是腾讯自己的项目,微信是腾讯自己的,他们在浏览器做了一些配置,对自己出的H5有“优待”他们,以保证视频的顺利“伪装”。上面的说法我还没有真正验证过,不过好像是这样的。很庆幸自己做的视频项目也是腾讯的。其实我有机会向他们证实上面的说法,但即便如此,也只有腾讯的项目才有这样的解决方案,这对广大开发者来说似乎太不公平了。我正在尝试找到删除播放控件的解决方案。以下是我花了很多时间寻找的解决方案。看到看起来很简单,没有那么高大上,但是确实解决了问题,分享给大家:我这里只看android的情况,ios基本没有问题,就忽略了。试机android版本:5.1首先我们把H5视频网址嵌入到自己的页面中,你会发现播放器确实出现了。如下图所示怎么办?如果不是腾讯自己的项目,就没有别的办法了吗?我查找了更多资料后,发现了一个细节。控制栏始终位于底部。能不能把视频放大一点,把控制条移到浏览窗口外面,这样我就看不到了。于是我将视频的宽高放大到120%-----控制条神奇地“消失”了(实际上是被推出了窗外),真是惊喜。具体思路和实现如下:将video标签外包给html中的一层,

初始样式表如下:html,body{padding:0;保证金:0;宽度:100%;高度:100%;-webkit-用户-选择:无;用户选择:无;溢出:隐藏;}.videobox{宽度:100%;高度:100%;位置:绝对;左:0;顶部:0;overflow:hidden;}video{width:1px;display:blcok;}/*注意:html,body中的overflow:hidden很重要,不能省略。因为微信android播放器脱离了DOM结构,不会响应点击、触摸等事件。如果视频尺寸太大,会产生滚动条。必须在html和body中添加overflow:hidden,但是在videobox中添加是没有用的。*/播放视频时更改视频的宽度(高度会按比例缩放,即使自定义高度没用也会被忽略)varvideo=document.querySelector('#mainvideo');varvideobox=document.querySelector('.videobox');//播放时改变外包的宽度,增加视频的宽度,//相应的高度也增加,播放器控件被压下,有overflow:hidden//控件看不见摸不着的时候它涉及到varsetVideoStyle=function(){videobox.style.width='120%';videobox.style.left='-10%';video.style.width='100%';}当然,上面混合了一些需求逻辑,也可以直接在样式表中设置width:120%或者更大;这个看你自己的需要了,但是基本思路是把播放器控件推到窗外,达到一种‘移除’和‘消失’的效果。连“小窗”二字都被挤出来了。用过android或者测试过的同学都知道点击小窗后会发生什么...(即使去掉原版播放器,小窗字样还在,我们把播放控件完全隐藏吧)相应的一些问题:1.视频放大后画面被截掉了怎么办?这样可以在输出视频的时候在两边和底部留下一些空白,也就是空白可以不用屏幕黑底,但是是视频尺寸的一部分。视频放大后,主图会填满窗口,被挤到外面。把它留空。2、视频播放完毕后,中间会自动出现播放控制按钮。如果您真的不希望视频播放后出现按钮,即使只有零点几秒,也请删除视频。您可以使用timeupdate来监控视频播放,并使用video.duration-video。当前时间差判断是否即将结束,在结束前零点几秒提前去掉。3.如果不是全屏视频怎么办?是的,思路是一样的,将video控件推出外层包裹层,使用overflow:hidden。只不过全面屏的外包装是机身。哦,终于可以完成全屏视频伪装了。2017-03-21补充时代变迁,设备技术更新,本着不伤害同胞的精神,还是要负责任的更新。下面就从以上4点说起ios和android。全屏处理;自动播放;播放控制;隐藏播放控制;补充--全屏处理ios加playsinline属性,之前只带webkit前缀,ios10之后,系统自带播放器会被解除,这两个属性都加在basicios端可以保证收敛到浏览器webview中。如果还有个别版本的ios会挂播放器,也可以参考一个库iphone-inline-video(具体用法很简单,在github上看,这里就不介绍了,补充一下一句话js,在css中加点),github地址是https://github.com/bfred-it/i...,加上playsinlinewebkit-playsinline和这个库的两个属性基本可以保证有ios端没问题(不过个人测试,只加这两个属性好像不引入库也可以,目前为止微信在ios端没问题,如果想兼容uc或者qq浏览器,建议自带这个库),最后引入一个新的x5-video-player-type="h5"属性,腾讯x5内核基于android微信和手Q内置浏览器的浏览器webview内核,使用该属性在微信中会有不同的表现,视频会以全屏状态出现。似乎播放控件被剥离了。至少添加设置该属性后,视频上层可能出现其他dom元素(腾讯白名单机制未提供的处理措施),补充——Autoplay安卓不能一直自动播放,就不多说了。值得一提的是,经测试,ios10以后版本的safari和微信不允许自动播放视频(顺便说一句,音频不能自动播放),但是微信提供了一个事件WeixinJSBridgeReady,在微信webview嵌入全局事件,视频依然可以自动播放。这个应该是比较靠谱的在ios端自动播放微信视频的方法。其他的,比如手Q或者其他浏览器,建议还是从引导用户触屏的行为入手比较好。//也可以在触发该事件后播放一次,然后暂停(以便以后视频处于loading状态,为后面流畅播放做准备)document.addEventListener("WeixinJSBridgeReady",function(){video.play();video.pause();},false)补充——播放控件关于控件,这里只补充一点,就是第一次播放视频的时候,在ios端,如果网络慢,从开始播放视频到显示视频会有一小段时间黑屏(处理视频源数据的时间),为了避免这个黑屏,可以添加在视频上加一个div浮层(可以fake视频第一帧),然后用timeupdate方法监听,然后在播放视频有画面的时候把浮层去掉video.addEventListener('timeupdate',function(){//当视频的currentTime大于0.1时,表示黑屏时间已经过去,有视频画面,可以去除浮层(.pagestart的div元素)如果(!video.isPlayed&&this.currentTime>0.1){$('.pagestart').fadeOut(500);video.isPlayed=!0;}})补充——隐藏播放控制据说腾讯的android团队的x5内核团队把视频播放的限制开启了,视频不一定调用他们饱受诟病的视频播放器。x5-video-player-type="h5"属性好像是那个意思,虽然体验还是有点……(导航栏也会被清理掉),但至少播放器控件没有了,而且上层可以浮动div或者其他元素,这个值得一提。另一点值得一提的是,在隐藏播放器控件的情况下,
比如这个videobox在android下是隐藏的,只display:none好像可以,但是加上z-index:-1,设置为-1的目的可以实现隐藏播放器控件。此测试可用且易于使用,您可以尝试一下。好了,就说这么多我能想到的,希望对大家有所帮助。资料来源:https://segmentfault.com/a/11…