随着 4G 的广泛以及 WiFi 的普遍使用,手机上的网速已经足够稳定和高速,以视频为主的 HTML5 也愈来愈广泛了,相比帧动画,视频的表现更加丰富,这里介绍一些实践经验。javascript
<video id="video" src="video.mp4" controls = "true" poster="images.jpg" /*视频封面*/ preload="auto" webkit-playsinline="true" /*这个属性是ios 10中设置能够 让视频在小窗内播放,也就是否是全屏播放*/ playsinline="true" /*IOS微信浏览器支持小窗内播放*/ x-webkit-airplay="allow" x5-video-player-type="h5" /*启用H5播放器,是wechat安卓版特性*/ x5-video-player-fullscreen="true" /*全屏设置, 设置为 true 是防止横屏*/ x5-video-orientation="portraint" //播放器支付的方向, landscape横屏,portraint竖屏,默认值为竖屏 style="object-fit:fill"> </video>
src: 视频的地址css
controls: 加上这个属性,Gecko 会提供用户控制,容许用户控制视频的播放,包括音量,跨帧,暂停/恢复播放。html
poster: 属性规定视频下载时显示的图像,或者在用户点击播放按钮前显示的图像。若是未设置该属性,则使用视频的第一帧来代替。java
preload: 属性规定在页面加载后载入视频。android
webkit-playsinline和playsinline: 视频播放时局域播放,不脱离文档流 。可是这个属性比较特别, 须要嵌入网页的APP好比WeChat中UIwebview 的allowsInlineMediaPlayback = YES webview.allowsInlineMediaPlayback = YES,才能生效。换句话说,若是APP不设置,你页面中加了这标签也无效,这也就是为何安卓手机WeChat 播放视频老是全屏,由于APP不支持playsinline,而ISO的WeChat却支持。
这里就要补充下,若是是想作全屏直播或者全屏H5体验的用户,IOS须要设置删除 webkit-playsinline 标签,由于你设置 false 是不支持的 ,安卓则不须要,由于默认全屏。但这时候全屏是有播放控件的,不管你有没有设置control。 作直播的可能用得着播放控件,可是全屏H5是不须要的,那么去除全屏播放时候的控件,须要如下设置:同层播放ios
x-webkit-airplay="allow" : 这个属性应该是使此视频支持ios的AirPlay功能。使用AirPlay能够直接从使用iOS的设备上的不一样位置播放视频、音乐还有照片文件,也就是说经过AirPlay功能能够实现影音文件的无线播放,固然前提是播放的终端设备也要支持相应的功能git
x5-video-player-type: 启用同层H5播放器,就是在视频全屏的时候,div能够呈如今视频层上,也是WeChat安卓版特有的属性。同层播放别名也叫作沉浸式播放,播放的时候看似全屏,可是已经除去了control和微信的导航栏,只留下"X"和"<"两键。目前的同层播放器只在Android(包括微信)上生效,暂时不支持iOS。至于为何同层播放只对安卓开放,是由于安卓不能像ISO同样局域播放,默认的全屏会使得一些界面操做被阻拦,若是是全屏H5还好,可是作直播的话,诸如弹幕那样的功能就没法实现了,因此这时候同层播放的概念就解决了这个问题。不过在测试的过程当中发现,不一样版本的IOS和安卓效果略有不一样github
x5-video-orientation: 声明播放器支持的方向,可选值landscape 横屏, portraint竖屏。默认值portraint。不管是直播仍是全屏H5通常都是竖屏播放,可是这个属性须要x5-video-player-type开启H5模式web
x5-video-player-fullscreen:全屏设置。它又两个属性值,ture和false,true支持全屏播放,false不支持全屏播放。其实,IOS 微信浏览器是Chrome的内核,相关的属性都支持,也是为何X5同层播放不支持的缘由。安卓微信浏览器是X5内核,一些属性标签好比playsinline就不支持,因此始终全屏。chrome
ios
ios加playsinline属性,以前只带webkit前缀的在ios10之后,会吊起系统自带播放器,两个属性都加上基本ios端均可以保证内敛到浏览器webview里面了。若是仍有个别版本的ios会吊起播放器,还能够引用一个库iphone-inline-video(具体用法很简单看它github,这里不介绍了,只需加js一句话,css加点),github地址加上playsinline webkit-playsinline这两个属性和这个库基本能够保证ios端没有问题了(不过亲测,只加这两个属性不引入库好像也是ok的,至今没有在ios端微信没有出现问题,若是你要兼容uc或者qq的浏览器建议带上这个库).
android
x5-video-player-type="h5"属性,腾讯x5内核系的android微信和手Q内置浏览器用的浏览器webview的内核,使用这个属性在微信中视频会有不一样的表现,会呈现全屏状态,貌似播放控件剥去了,至少加了这个属性后视频上层能够有其余dom元素出现了(非腾讯白名单机制的一种处理措施)。
<video id="video" src="xx.mp4" playsinline webkit-playsinline></video>
android始终不能自动播放,很少说。值得一提的是经测如今ios10后版本的safari和微信都不让视频自动播放了(顺带音频也不能自动播放了),但微信提供了一个事件WeixinJSBridgeReady,在微信嵌入webview全局的这个事件触发后,视频仍能够自动播放,这个应该是如今在ios端微信的视频自动播放的比较靠谱的方式,其余如手q或者其余浏览器,建议就引导用户出发触屏的行为操做出发比较好。
document.addEventListener("WeixinJSBridgeReady", function (){ video.play(); video.pause(); }, false)
对于video或者audio等媒体元素,有一些方法,经常使用的有play(),pause();也有一些事件,如'loadstart','canplay','canplaythrough','ended','timeupdate'.....等等。
在移动端有一些坑须要注意,不要轻易使用媒体元素的除'ended','timeupdate'之外event事件,在不一样的机子上可能有不一样的状况产生,例如:ios下监听'canplay'和'canplaythrough'(是否已缓冲了足够的数据能够流畅播放),当加载时是不会触发的,即便preload="auto"也没用,但在pc的chrome调试器下和android下,是会在加载阶段就触发。ios须要播放后才会触发。总之就是如今的视频标准还不尽完善,有不少坑要注意,要使用前最好本身亲测一遍
就是当第一次播放视频的时候ios端,若是网络慢,视频从开始播到能展示画面会有短暂的黑屏(处理视频源数据的时间),为了不这个黑屏,能够在视频上加个div浮层(能够一个假的视频第一帧),而后用timeupdate方法监听,视屏播放及有画面的时候再移除浮层
video.addEventListener('timeupdate',function (){ //当视频的currentTime大于0.1时表示黑屏时间已过,已有视频画面,能够移除浮层(.pagestart的div元素) if ( !video.isPlayed && this.currentTime>0.1 ){ $('.pagestart').fadeOut(500); video.isPlayed = !0; } })
听说腾讯的android团队的x5内核团队放开了视频播放的限制,视频不必定调用它们那个备受诟病的视频播放器了,x5-video-player-type="h5"属性这个属性好像就有点那个意思,虽然体验仍是有点...(导航栏也会清理)但至少播放器控件没有了,上层能够浮div或者其余元素了,这个仍是值得一提。还有一点值得说的是,带播放器控件的隐藏.
<div class="videobox" ontouchmove="return false;"> <video id="mainvideo" src="test.mp4" x5-video-player-type="h5" playsinline webkit-playsinline></video> </div>
好比这个videobox在android下隐藏,只用display:none貌似仍是不行的,但加个z-index:-1,设置成-1就能够达到隐藏播放器控件的目的了。
原文:http://www.javashuo.com/article/p-frxvevtc-dv.html
HTML中直接使用video来播放视频,在Chrome浏览器、360浏览器、QQ浏览器(以及其余一些使用Chrome内核Blink)等中都会出现下载按钮,但咱们通常又不但愿出现下载按钮。
好像是从Chrome 54版本开发有下载按钮的(从网上看到的,我也不肯定),网上有css解决方案,以下:
video::-internal-media-controls-download-button {
display:none;
}
video::-webkit-media-controls-enclosure {
overflow:hidden;
}
video::-webkit-media-controls-panel {
width: calc(100% + 30px);
}
我试了以后在chrome内核: 56.0.2924.90 之下确实能够将下载按钮去除,不过看上面的css大体意思就是将控制器的宽度加宽30px,而后经过overflow:hidden;去除显示,不过感受好像不是多靠谱,而后接着网上看资料,就看到了HTMLMediaElement.controlsList。
HTMLMediaElement.controlsList
HTMLMediaElement接口的controlsList 属性返回DOMTokenList,帮助用户在显示其本身的控件集时选择要在媒体元素上显示的控件。DOMTokenList能够设置如下三个可能值中的一个或多个:nodownload,nofullscreen和noremoteplayback。
也就是说能够经过设置controlsList属性来控制是否显示下载按钮,以下:
<video controls controlslist="nodownload" id="video" src=""></video>
1
设置controlslist="nodownload"以后,在我当前使用的Chrome浏览器(69)就不会出现下载按钮。
关于controlsList能够查看https://developer.mozilla.org/zh-CN/docs/Web/API/HTMLMediaElement/controlsList 。
这里是一个关于controlsList使用的示例 。
可是我又想兼容例如56版本的Chrome浏览器怎么办呢,我试着加上上述的css解决方案并设置controlslist="nodownload",在56版本的Chrome浏览器和69版本的谷歌浏览器两个均可以正常显示。
可是我用360浏览器(内核版本63)以及QQ浏览器(内核版本63)若是同时设置以上的两种解决方案是有问题的,会将全屏按钮一并隐藏,因此可能在56版本的Chrome浏览器不支持controlslist="nodownload"就将其忽略,而在69版本的谷歌浏览器上面的css解决方案已经无效了。
因此如今若是要统一解决的话,在低版本54.0-57.0之间使用上面的css解决方案,而在58版本以后使用controlslist="nodownload"解决。————————————————版权声明:本文为CSDN博主「樊小书生」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处连接及本声明。原文连接:https://blog.csdn.net/fxss5201/article/details/83513275