文章地址: http://www.xiabingbao.com/video/2016/09/03/phone-video.htmljavascript
昨天新上线了一个关于腾讯18周年嘉年华的html5,这个html5是有5段不一样的视频组成,中间使用各类手势进行串联,欢迎你们访问。html
众所周知,在移动端的视频和音频都是须要用户手动点击开启的,而使用autoplay
或在js里写play()
是没有任何做用的。还有几个常见的问题这里也提示一下:html5
iOS不支持preload
属性,android可能会支持,没太细测试。用户只有在点击的时候才会去加载视频;java
iOS不支持autoplay
属性,需手动点击开启,使用setTimeout延迟开启也不行;android
canplaythrough
表示但是流畅播放了,可是在android下是没有卵用的; 有的android下是播放完成后才会触发。web
playing
表示开始播放了,android下无效;网络
canplay
认为是视频元素没有问题,能够运行,没有更多含义了,基本用不上,android下同样;ide
iOS和android都支持ended事件,但不能在ended事件里启动一段音频或视频,所以不能使用ended
进行视频的循环播放;函数
有的iOS版本下,会弹出一个全屏播放器来播放视频,iPad则支持内联播放。有人说添加webkit-playsinline
属性便可支持内联播放,不过我这儿并无什么卵用。全屏播放后,会形成操做很不流畅,必须关闭视频的全屏效果,才能进行下一步的操做;测试
在网络不太好,或视频比较大的状况下,在点击和正式播放的空隙内会有一段等待视频加载的时间;有时候也会出现只有音频而没有画面的状况。
针对这些问题,有的是系统级的问题(好比调起全屏的播放器,循环播放视频等),咱们没法修改;其余的,咱们都尽可能地经过程序来实现。
不能,没有任何的办法来判断视频的加载进度,并且在iOS中,只有视频在播放的时候,才临时去加载视频。所以,即便在video标签中写了preload
属性也是无论用的。使用canplaythrough
事件也是无法检测的,虽然video标签在加载的时候会触发canplaythrough方法,但播放时依然会有卡顿的现象,并且某些android还不支持次属性。
有部分缘由是视频的编码不正确,在mp4格式的视频中,只支持h.264的视频。个人项目中也遇到了这种状况,但不是视频编码的问题。我在本身的网络下测试时,没有这样的问题,可是在外部环境测试时就会出现黑屏、有声音没图像的状况。那么应该就是视频有点大了,而后我就把视频压缩了一下,结果仍是会有这样的状况出现。
通过同事的指点,我在用户点击和视频正式播放以前添加一个loading效果,当视频正式播放的时候就取消loading。以下:
function video_loading( $video ){ $('.video_loading').show(); var timer = setInterval(function(){ var currentTime = $video[0].currentTime; // 检测当前的播放时间 if( currentTime>0 ){ $('.video_loading').hide(); clearInterval( timer ); } }, 100) }
完美解决黑屏和有声音没图像的问题。
咱们是没法在视频上直接进行滑动和点击等操做的,只能是在视频播放结束时,添加一个透明遮罩,让用户在遮罩上进行操做。
/** 视频的播放时间改变时进行的操做 videoid video标签的id cur 当前播放时间,能够传入ended参数 func 回调函数 */ videoUpdate : function(videoid, cur, func){ var myVideo = document.getElementById(videoid); if( myVideo ){ if( typeof cur =='number' ){ myVideo.addEventListener('timeupdate', function(){ if( this.currentTime>=cur ){ func(); myVideo.removeEventListener('timeupdate', function(){ }, false); } }, false); }else{ myVideo.addEventListener(cur, function(){ func(); }, false); } } }
使用方法:
// 第一屏的视频进行到4秒时,显示透明图层以提供用户操做 tool.videoUpdate( 'video1', 4, function(){ $('.s1 .overlay').show(); }); // 第一屏的视频结束时,显示向下滑动提示按钮 tool.videoUpdate( 'video1', 'ended', function(){ $('.s1 .tip').show(); });
这是第一次作移动端的视频播放html5,在不少地方还有不足的地方,欢迎你们提出意见和建议。
文章地址: http://www.xiabingbao.com/video/2016/09/03/phone-video.html