1.安卓video标签飞起
解决方案:x5-video-player-type启用H5同层播放器
<video src="http://xxx.mp4" x5-video-player-type="h5"/>
2.x5-video-player-fullscreen全屏方式
视频在播放时进入到全屏模式
注:此属性是需要自己来重新适配新的视口大小变化(可以通过监听resize事件来实现)
<video id="test_video" src="xxx" x5-video-player-type="h5" x5-video-player-fullscreen="true"/>
监听窗口大小变化(resize)实现全屏效果
window.onresize = function(){
test_video.style.width = window.innerWidth + “px”;
test_video.style.height = window.innerHeight + “px”;
}
注:为了让视频真正铺满全屏,可以适当让video的显示区域大于视口区域,这样在显示时在视口外的部截掉后,不会出四周黑边的情况
使用同层播放器的一些建议:
.•监听resize事件实现自适应视口大小变化,视频播放时会调整视口大小
.•在视频播放期间的交互,弹框,字幕在视频视频区域中,不要在视频区域外
.•对于直播类全屏视频,最好不要在最顶部放交互性元素
交互性视频实现的建议
允许视频区域(video元素)之上的操作
.•对于需要全屏交互的,可以将video区域设置为视口大小
3.video全屏:
ios加playsinline属性,之前只带webkit前缀的在ios10以后,会吊起系统自带播放器,两个属性都加上基本ios端都可以保证内敛到浏览器webview里面了。如果仍有个别版本的ios会吊起播放器,还可以引用一个库iphone-inline-video(具体用法很简单看它github,这里不介绍了,只需加js一句话,css加点),
github地址是https://github.com/bfred-it/i...,加上playsinline webkit-playsinline这两个属性和这个库基本可以保证ios端没有问题了
(不过亲测,只加这两个属性不引入库好像也是ok的,至今没有在ios端微信没有出现问题,如果你要兼容uc或者qq的浏览器建议带上这个库),
最后介绍个新的x5-video-player-type="h5"属性,腾讯x5内核系的android微信和手Q内置浏览器用的浏览器webview的内核,使用这个属性在微信中视频会有不同的表现,会呈现全屏状态,貌似播放控件剥去了,至少加了这个属性后视频上层可以有其他dom元素出现了(非腾讯白名单机制的一种处理措施),
4.video的自动播放
android下是不允许自动播放的,即使你用了video.play(),也是不行的。必须有用户的主动触发,比如触摸了屏幕,有click或touch事件产生。比较的好的办法是,引导用户触发,滑屏或touch的行为,然后调用video.play()播放
<div class="videobox">
<video id="mainvideo" webkit-playsinline="true" src="http://7xvl2z.com1.z0.glb.clouddn.com/nigg2.mp4"></video>
</div>
html,body {
padding: 0;
margin: 0;
width: 100%;
height: 100%;
-webkit-user-select: none;
user-select: none;
overflow: hidden;
}
.videobox {
width: 100%;
height: 100%;
position: absolute;
left: 0;
top: 0;
overflow: hidden;
}
video {width: 1px;display: blcok;}
/*
注:html,body里的overflow:hidden,非常重要,不能省。
因为微信android的播放器是脱离DOM结构的,也不会响应click、touch等事件。
如果视频尺寸大了,会产生滚动条,必须在html和body加overflow:hidden,
在videobox加没用的。
*/
当视频要播放时改变video的宽度(高度会等比缩放,即使自定义高度也是没用的,会被忽略)
var video = document.querySelector('#mainvideo');
var videobox = document.querySelector('.videobox');
//播放时改变外层包裹的宽度,使video宽度增加,
//相应高度也增加了,播放器控件被挤下去,配合overflow:hidden
//控件看不见也触摸不到了
var setVideoStyle = function (){
videobox.style.width = '120%';
videobox.style.left = '-10%';
video.style.width = '100%';
}
android始终不能自动播放,值得一提的是经测现在ios10后版本的safari和微信都不让视频自动播放了(顺带音频也不能自动播放了),但微信提供了一个事件WeixinJSBridgeReady,在微信嵌入webview全局的这个事件触发后,视频仍可以自动播放,这个应该是现在在ios端微信的视频自动播放的比较靠谱的方式,其他如手q或者其他浏览器,建议就引导用户出发触屏的行为操作出发比较好。
//也可以在这个事件触发后播放一次然后暂停(这样以后视频会处于加载状态,为后面的流畅播放做准备)
document.addEventListener("WeixinJSBridgeReady", function (){
video.play();
video.pause();
}, false)
5.播放控制
关于控制,当第一次播放视频的时候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;
}
})
6.隐藏播放控件
据说腾讯的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就可以达到隐藏播放器控件的目的了。
7,视频被放大了,画面会被截掉一部分怎么办?
这个可以在视频输出的时候两边和下边留一些留白,即留白可以没用画面黑色底,但又属于视频尺寸的一部分,放视频放大后,将主体画面置满视窗,被挤到外面都是留白的即可。
8,视频播放完毕后会中间自动出现播放控件按钮
如果确实不想在播放完是出现一个按钮,哪怕只有零点几秒,就把视频remove掉,可以使用timeupdate监听视频播放,用video.duration-video.currentTime的差值判断是否快要结束了,在结束前零点几秒提前remove掉。
7,不全屏视频处理?
将视频控件顶出外层的包裹层,利用overflow:hidden。只是全屏的外层包裹是body而已。