全栈笔记让前端飞参考库

浅谈video标签在移动端的运用

2018-08-26  本文已影响6人  韭菜的故事

最近在移动端项目用到了video标签展示视频,原本以为作为html5标准一员的video到了今天兼容性应该没什么问题了,可一用才知道还是有些坑的......那么在这里就由浅入深的论述一下使用video的心得吧(一些众所周知的常用属性和我没怎么用过的在此均省略不表)。

属性

以上几种属性是写video标签时经常设置的几种属性,以下的几种则一般是需要在js中获取的属性,以便进行一些操作。

一般用到的就是1和2,当值为1的时候表示视频已经可以播放了(至少是当前帧已经加载好了,不过ios此时播放可能会白屏),值为2的时候播放下一帧会卡住(安卓)或者白屏(ios)。

注意:
  1. 返回的值是Number类型,这使得在使用mint-ui这类的ui框架调试时可能会Toast一个空值,需要先转为字符串才能显示。
  2. 关于ios上返回2继续播放会白屏的问题(仅仅出现在视频第一次点击播放的时候),这里我暂时没发现是什么原因导致的(有可能是视频太大??)

我在项目中先使用的就是这个属性,在返回1或2的时候代表刚进入这个页面浏览器还在加载视频,返回4则代表整个视频已经加载完毕了。可是我发现ios在返回3的时候立即播放还是有时会出现白屏,而安卓在返回3的时候是可以播放的,因此最后我选择了使用networkState来对视频加载状态进行判断。

方法

我一般用到的方法也就是play(),pause()这里不过多赘述。

事件

应用

项目基于vue,ui框架使用的是mint-ui,还是直接上代码吧...

    <div class="video-con fl">
        <div class="video" @click="$_videoFromApp_getVideoRecord">
            <!-- 后台没有视频时显示的内容 -->
            <img class="no-video" v-show="videoFromApp_noVideo" :src="require('@/images/icon/video.png')" alt="">
            <div class="bg-gray" v-show="videoFromApp_noVideo"></div>
            <!-- 视频处于暂停时显示的内容 -->
            <div v-show="!videoFromApp_playing">
                <img class="play-video" v-show="!videoFromApp_noVideo"
                     :src="require('@/images/icon/play-video.png')" alt="">
                <span class="play-time" v-show="!videoFromApp_noVideo">{{videoFromApp_videoTime}}</span>
            </div>
            <!-- loading -->
            <mt-spinner v-show="videoFromApp_loading" class="loading-css" type="fading-circle"></mt-spinner>
            <!-- 视频 -->
            <video webkit-playsinline playsinline
                   ref="indentVideo"
                   class="real-video"
                   :src="videoFromApp_videoSrc"
                   v-show="!videoFromApp_noVideo"
                   :poster="videoFromApp_videoImg"
                   @progress="$_videoFromApp_hasVideo"
                   @waiting="$_videoFromApp_waiting"
                   @ended="$_videoFromApp_endVideo"></video>
        </div>
    </div>

js部分

<script>
......
        //播放视频
        $_videoFromApp_getVideoRecord(v){
           ......
            if (this.videoFromApp_playing) {
                    this.videoFromApp_playing = false;
                    this.$refs.indentVideo.pause();
                } else {
                    this.videoFromApp_playing = true;
                    let video = this.$refs.indentVideo;
                    let networkState = this.$refs.indentVideo.networkState;
                    let readyState = this.$refs.indentVideo.readyState;
                    if(networkState==1){
                        this.$refs.indentVideo.play();
                        this.videoFromApp_loading = true;
                        video.ontimeupdate = ()=>{
                            if(video.currentTime > 0.1){
                                this.videoFromApp_loading = false;
                            }
                        }
                    }else{
                        Toast({
                            message: '拼命加载中,请稍后',
                            position: 'bottom',
                            duration: 1000
                        });
                        this.videoFromApp_playing = false;
                    }
                }
        },
        //视频初步加载
        $_videoFromApp_hasVideo(){
            this.videoFromApp_loading = false;
        },
        //缓冲
        $_videoFromApp_waiting(){
            this.$refs.indentVideo.pause();
            this.videoFromApp_playing = false;
            Toast({
                message: '拼命加载中,请稍后',
                position: 'bottom',
                duration: 1000
            });
        },
        //视频播放完成
        $_videoFromApp_endVideo(){
            this.videoFromApp_playing = false;
        },
</script>

在此就简述一下播放视频方法,当视频处于暂停状态时,点击播放,判断networkState,当值为1的时候允许播放,此时监听timeupdate事件,(使用addEventListener监听会有毛病,如果看过我之前的一篇关于iframe的文章应该会有所了解)先加上loading,如果currentTime > 0.1代表视频已经能流畅播放了,再隐藏loading。这个过程中如果无法播放的话就会走到waitting事件中,视频会暂停。
再次点击继续重复这个过程直到视频可以正常播放。

写在后面

其实吧本文写作的真正目的是为了抛砖引玉,文中所写的一些方法只为解决项目中的燃眉之急,文中部分内容仅仅为个人观点,如果各位读者发现了文中的缺陷与问题,欢迎在评论区留言探讨。
最后,转载请注明出处https://www.jianshu.com/p/8f39050aa607

本文参考文章
视频播放--踩坑小计
h5 video 移动端填坑记
移动端实践 - video

上一篇 下一篇

猜你喜欢

热点阅读