android微信视频播放填坑指南

前言

某日,正在愉快着敲着代码的我,突然发现了一个诡异的现象,在android微信中,只要视频播放后,不能把普通dom元素(div等)覆盖在video上,就算是z-index为9999999也无法实现,如图:

Alt pic

我只是播放了一下视频,怎么结构样式全部发生了变化,还有我覆盖在视频上的小按钮

正文

我们知道,android的微信浏览器,是基于X5内核进行渲染。那么,这样的现象会不会X5的一个bug?经过资料的查询,发现在android微信中,video标签会自动被X5所劫持,换成原生的播放器去播放,也就是说,我们看到的video其实不在是html5规范里面的那个video了,已经脱离文档流换成微信的播放器,自然,z-index已经起不到什么作用了,同时播放完成后你甚至可以看到腾讯的广告(是不是有一万只草泥马飘过)。官方的人是这么解释的:

X5内核视频播放使用了自研的播放器,考虑用户体验,我们使用了统一的播放界面。如果有相关问题,请联系腾讯浏览服务产品经理做进一步交流。(就是这么霸气不要问为什么,因为很cooooooool~~)

那么有没有什么方法去解决被劫持的问题呢?答案是有的

方案1

Alt pic

我们发现X5内核加载页面后,会有这么一段JS代码注入到页面中。同时发现这一些网站上的video没有被劫持,拿bilibili为例,发现bilibili的视频上只是加了一个(如下图)但是,对应到我们自己的video加上该属性,没有起到任何作用,也就是说,x5内核存在白名单机制,只要申请了白名单,就可以不被劫持,愉快的使用标准的video标签渲染视频了。

Alt pic

Q: 那么怎么申请白名单呢?

A:官方已经去掉了申请白名单入口,已经没有办法在申请了

Q:既然不能申请白名单,还说什么?浪费时间!

A:这样才能愉快的介绍方案2

方案2

在浏览X5的时候,我们找到了这样一个文档https://x5.tencent.com/tbs/guide/video.html, 同层浏览器,什么意思呢,就是说,如果你在video标签上添加 * x5-video-player-type="h5" x5-video-player-fullscreen="true"*就可以实现用元素去覆盖video这样一个功能了(初见文档内心还有一点小激动,可用起来,还有很多坑需要去填)

既然官方已经声明了可以用,那么我们就用来试试看,根据官方定义,使用同层浏览器后,就可以将普通元素覆盖到video上,但是,声明同层浏览器,会自动在播放视频的时候,进行全屏,像这样:

Alt pic

按照官方文档所述,只要修改video元素的「object-position」属性,就可以修改视频部分的显示位置,但实际上还要把video元素的宽高设成屏幕的宽高才行:

使用NEJ语法改写如下

_event._$addEvent(this._videoNode, "x5videoenterfullscreen", this._onx5VideoEnterFullScreen._$bind(this));
_event._$addEvent(this._videoNode, "x5videoexitfullscreen", this._onx5VideoExitFullScreen._$bind(this));

 // x5内核浏览器全屏
    _pro._onx5VideoEnterFullScreen = function () {
        _element._$setStyle(this._videoNode, 'width', window.screen.width + 'px');
        _element._$setStyle(this._videoNode, 'height', window.screen.height + 'px');
        _element._$addClassName(document.body,'z-x5-video-fullscreen');
    }

    _pro._onx5VideoExitFullScreen = function () {
        _element._$setStyle(this._videoNode, 'width', '');
        _element._$setStyle(this._videoNode, 'height', '');
        _element._$delClassName(document.body,'z-x5-video-fullscreen');
        _element._$delClassName(document.body,'z-x5-video-fullscreen-landscape');
    }
video{
    object-position:center top
}

改写后

Alt pic

使用object-position样式配合全屏video,就可以将显示部分加到任意想要的地方了,然后通过给其他元素设置z-index值大于video的z-index,就可以完成覆盖了(欢呼,撒花 ╰(°▽°)╯)

你以为文章这么简单就完了吗?太天真了,产品同学是不会提这么简单的需求的

产品同学:你的这个不能全屏啊,给加个全屏。

A: 全屏还不容易吗,全屏api就是requestFullScreen嘛,微信里面就是webkitRequestFullScreen

来我们掉用一下,诶?怎么不对劲,用控制台打印微信内容,确实有这个方法,怎么调用无效呢;诶,我先调用api,在去播放视频就可以全屏了;但是我先播放视频在去调用api发现X5是不会理我们的!!这应该是一个X5的bug,同时还发现,使用video原生controls上的全屏按钮而不是api也是可以全屏的!

也就是说,在播放的时候去调用全屏api是无法实现全屏的,那么只能通过其他手段来实现全屏,通过不断的去摸索,发现文档中介绍了x5内核的video会有这样一个属性x5-video-orientation,这个属性用于控制播放器全屏状态下是横屏展示还是竖屏展示,默认是竖屏,那么基于这个属性,可否间接满足全屏条件呢。经过探索在调用全屏api时,设置该属性,可以实时的控制播放器横屏和竖屏,那么实现就简单了。

//判断
  if (_mobileUtil._$isWeixin() && _mobileUtil._$isAndroid()) {
                var node = document.querySelector('#video');
                // 模拟全屏
                _element._$attr(node, 'x5-video-orientation', 'landscape');
                //添加全屏全局样式
                _element._$addClassName(document.body, 'z-x5-video-fullscreen-landscape');
                setTimeout(function () {  
                   //因为横屏宽高发生了变化,所以设置宽高
                    node.style.width = window.screen.width + 'px';
                    node.style.width = window.screen.height + 'px';
                });
            } else {
                this._rootNode.webkitRequestFullScreen();
            }

同理,取消全屏,只需要设置x5-video-orientation的值为portrait即可

 if (_mobileUtil._$isWeixin() && _mobileUtil._$isAndroid()) {
                var node = document.querySelector('.j-mainVideo video');
                node.setAttribute('x5-video-orientation',"portrait");
                setTimeout(function () {
                    node.style.width =window.screen.width+'px';
                    node.style.width =window.screen.height+'px';
                }._$bind(this));
            } else {
                document.webkitCancelFullScreen();
            }

同时,点击左上角的按钮会退出视频播放,也应该清除全屏

 _pro._onx5VideoExitFullScreen = function () {
        _element._$setStyle(this._videoNode, 'width', '');
        _element._$setStyle(this._videoNode, 'height', '');
        _element._$delClassName(document.body,'z-x5-video-fullscreen');
        _element._$delClassName(document.body,'z-x5-video-fullscreen-landscape');
  // 退出后需要设置为竖屏全屏,x5内核
        _element._$attr(this._videoNode, 'x5-video-orientation', 'portrait');
    }   

结果

Alt pic

总结

  1. x5内核接管了video的播放,体验和苹果是不同的,如果能加入白名单最好加入白名单
  2. 默认的x5播放器会播放广告,体验极差
  3. 同级播放器有一定的bug,需要通过一些api手段去规避解决

参考文章

  1. H5 直播避坑指南
  2. X5同层播放器试用报告
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容