1、x5同层播放器

移动端浏览器中的video元素是比较特别的,早期无论是在iOS还是Android的浏览器中,它都位于页面的最顶层,无法被遮盖。后来这个问题在iOS下得到了解决,但是Android的浏览器则问题依旧。X5是腾讯基于Webkit开发的渲染引擎,它提供了一种名叫「同层播放器」的特殊video元素以解决遮盖问题。

只要给普通的video元素加上X5的自定义属性 x5-video-player-type,就可以调用同层播放器。

<div class="player">
    <video id="video" class="video" controls="controls" playsinline x5-video-player-type="h5">
        <source src="video.mp4" />
    </video>
</div>
复制代码

同层播放器的视频样式和ios的视频播放器是一样的。安卓的原生播放器(非同层播放器)无法控制是否自动播放、点击播放时是否自动全屏。

2、autoplay自动播放

video标签可以设置自动播放,只需在标签设置autoplay即可。但是,设置自动播放是会有兼容性问题的,并不是所有机型都可以。

1.我所遇到的,设置了autoply ios基本可以实现自动播放,但是要设置静音,即:没音频轨道,或者设置了muted属性。

2.安卓的话,只有部分机型可以自动播放。而且不能模拟自动播放,一定要有用户行为才可以触发播放。

3、视频行内播放

默认情况下,点击video播放会全屏播放,如果想要视频在局部内可以播放的话,可以设置:x5-playsinline

4、视频全屏播放后的大小

这个情况只针对安卓的同层播放器播放时全屏播放的情况。在同层播放器全屏播放后,视频底色会变成黑色,然后视频只是在中间居中,大小是原来视频设置的大小,并不是会全屏铺满。


效果如图。

1、我第一次采用的方案是,当视频全屏时,会触发onresize方法,在该方法里面强制把视频的大小设置为屏幕的宽高:


let video = this.$refs.video;
            // 以下代码是为了解决安卓播放无办法自动全屏
            this.myPlayer.on('play',() => {
                console.log('play')
                    window.onresize = function () {
                    document.querySelector('.video-container').style.width = window.innerWidth + "px";
                    document.querySelector('.video-container').style.height = document.documentElement.clientHeight + "px";         
                    }
            })
            this.myPlayer.on('pause',() => {
                console.log('pause')
                window.onresize = function () {
                    document.querySelector('.video-container').style.width = "270px";
                    document.querySelector('.video-container').style.height = "170px";
                }
            })
复制代码

但是这种方法,由于是整个视频的尺寸直接设置为当前屏幕的宽高,因此测试反映说视频被拉伸变形了,因为尺寸不是按照比例的。 2、因此,采取以下方案。videoHeight()和videoWidth()分别获取原视频的高和宽,然后与屏幕的宽高计算出比例。

if (MJSSDK.UA.android) {
                this.myPlayer.on('play', () => {
                    // console.log('play');
                    window.onresize = () => {
                        // console.log('onresize-play');
                        this.isfull = true;
                        let vheight = this.myPlayer.videoHeight();
                        let vweight = this.myPlayer.videoWidth();
                        let clientHeight = document.documentElement.clientHeight;
                        document.querySelector('.video-container').style.width = (clientHeight * vweight) / vheight + 'px';
                        document.querySelector('.video-container').style.height = clientHeight + 'px';
                        document.querySelector('#my-video').style.backgroundColor = 'black';
                    };
                });
                this.myPlayer.on('pause', () => {
                    // console.log('pause');
                    window.onresize = () => {
                        // console.log('onresize-pause');
                        this.isfull = false;
                        // 全屏后,华为等部分机型会有白边,是页面的颜色,用该值控制背景色
                        document.querySelector('.video-container').style.width = '270px';
                        document.querySelector('.video-container').style.height = '170px';
                    };
                });
            }
        },
复制代码

5、视频全屏后出现白边

安卓启用同层播放器后全屏出现的,这是个很诡异的问题,仅在部分的安卓机型下出现。如图:


经过排查,该白边是页面的颜色,就是同层播放器的全屏是把这个页面旋转过来,然后区域放大这样。 解决方法:全屏时把页面背景色设置为黑色,取消全屏时改回来。