微信H5視頻自動(dòng)彈出全屏播放的解決方案

微信播放最大坑

h5頁面分享到微信上播放視頻,最大的坑就是在Android手機(jī)上,X5瀏覽器會(huì)劫持Video標(biāo)簽用騰訊播放器彈出全屏播放,處于最上層,覆蓋DOM元素,更可惡的是播放完畢時(shí),會(huì)出現(xiàn)很多騰訊的廣告視頻,比如:

同層播放

X5瀏覽器為了解決覆蓋DOM元素的問題,提出了一個(gè)同層播放的概念,通俗一點(diǎn)講就是視頻播放還是要彈出全屏的,但是視頻可以不覆蓋DOM元素,可以和視頻在同一層,雖然這方案有點(diǎn)別扭,但總算解決了覆蓋DOM元素的問題,特別是對(duì)于H5直播來說非常重要,可參考X5的同層播放

同層播放的實(shí)現(xiàn)

雖然X5提供了一些屬性可以用于同層播放的設(shè)置,但是還是有一些細(xì)節(jié)需要處理:

  • X5彈出全屏播放時(shí),需要訂閱resize和全屏事件,對(duì)于video以及容器大小的調(diào)整

  • 點(diǎn)擊微信頂部的返回按鈕時(shí),退出全屏播放時(shí),需要訂閱退出全屏事件,根據(jù)業(yè)務(wù)實(shí)際情況處理,比如有的場(chǎng)景需要關(guān)閉當(dāng)前頁面,給用戶一種退出當(dāng)前頁面的體驗(yàn)。

  • 設(shè)置視頻的顯示位置, 比如全屏直播視頻要全屏顯示,普通的播放視頻在左上角顯示,點(diǎn)擊全屏按鈕時(shí),又要居中顯示。

很多細(xì)節(jié)的東西需要處理, 發(fā)現(xiàn)Aliplayer播放器在最新發(fā)布的版本中支持了X5瀏覽器的h5的同層播放,并且很多細(xì)節(jié)的東西幫助實(shí)現(xiàn)了,下面使用Aliplayer實(shí)現(xiàn)了兩個(gè)例子:

點(diǎn)播視頻H5Demo

全屏直播H5LiveDemo

點(diǎn)播視頻

視頻點(diǎn)播的一般的布局是上半部分為視頻播放區(qū)域,下半部分為播放列表和評(píng)論區(qū)域,在Android 微信上的播放效果如下:

代碼可以參考點(diǎn)播視頻H5Demo

創(chuàng)建播放器

通過 x5_video_position和 x5_type屬性指定視頻的顯示位置和啟用H5同層播放


var player = new Aliplayer({
            id: 'J_prismPlayer',
            autoplay: true,
            isLive:false,
            playsinline:true,
            controlBarVisibility:'always',
            source:"",
            useH5Prism:true,
            x5_video_position:'top', //指定視頻在上部顯示
            x5_type:'h5' //聲明啟用同層H5播放器,支持的值:h5
        });

彈出全屏播放時(shí)的處理

這里主要分兩種情況:

  1. 在點(diǎn)擊播放按鈕開始播放時(shí),微信劫持視頻彈出全屏播放,這時(shí)候Aliplayer也會(huì)觸發(fā)全屏事件,在這里調(diào)用取消全屏方法。

  2. 用戶點(diǎn)擊Controlbar上的全屏按鈕時(shí),這個(gè)時(shí)候也會(huì)觸發(fā)全屏事件,在這里可以調(diào)整視頻為居中顯示。

上面兩種情況的處理有點(diǎn)不一樣的


        this._firstFullscreen = true;
        let that = this;
        this.player.on('requestFullScreen',(e)=>{
            if(that._firstFullscreen)
            {
                that.player.cancelFullScreen();
                that._firstFullscreen = false;
            }
            else
            {
                let video=$(that.player.el()).find('video');
                video.addClass('center');
            }
        });

視頻居中的樣式


video.center
{
    object-position:50% 50% !important;
}

退出全屏?xí)r恢復(fù)視頻頂部播放

退出全屏的時(shí)候會(huì)出發(fā)事件,在事件里移除居中的樣式


 this.player.on('cancelFullScreen',(e)=>{
            let video=$(that.player.el()).find('video');
            video.removeClass('center');
        })

直播全屏播放

直播場(chǎng)景下會(huì)把視頻充滿整個(gè)屏幕,在上面顯示評(píng)論、點(diǎn)贊、主播和觀眾信息等,比如:

代碼可以參考全屏直播H5LiveDemo

創(chuàng)建播放器

通過x5_fullscreen和 x5_type屬性指定視頻全屏播放和啟用H5同層播放,另外需要去掉Controlbar,要通過skinLayout自定義UI。


var player = new Aliplayer({
            id: 'J_prismPlayer',
            autoplay: true,
            isLive:true,
            playsinline:true,
            controlBarVisibility:'always',
            source:"",
            useH5Prism:true,
            x5_fullscreen:true, //全屏播放
            x5_type:'h5', //聲明啟用同層H5播放器,支持的值:h5
            skinLayout:[
             {name:"bigPlayButton", align:"blabs", x:"70", y:"150"},
             {name: "H5Loading", align: "cc"}
             ]
        });

彈出全屏播放時(shí)的處理

在點(diǎn)擊播放按鈕開始播放時(shí),微信劫持視頻彈出全屏播放,這時(shí)候Aliplayer也會(huì)觸發(fā)全屏事件,在這里調(diào)用取消全屏方法,并且調(diào)整評(píng)論、點(diǎn)贊等的布局。


        let that = this;
        this.player.on('requestFullScreen',(e)=>{
            that.adjustLayout(true);
            that.player.cancelFullScreen();
        });

改變視頻顯示方式

全屏播放視頻默認(rèn)是平鋪的,如果想不平鋪可以設(shè)置object-fit的樣式為contain或其它


video{
    object-fit: contain !important;
}

微信返回時(shí)關(guān)閉頁面

微信在原來的頁面上面打開另一個(gè)頁面全屏播放視頻, 如果正常流程返回時(shí),是返回到程序原來的頁面,我希望是返回時(shí)直接關(guān)閉頁面。


 this.player.tag.addEventListener("x5videoexitfullscreen",()=>{
      if(WeixinJSBridge)
           WeixinJSBridge.call('closeWindow');
 });

視頻顯示模式和位置

如果"x_video_position"的兩個(gè)值top和center不能滿足要求,可以通過自定義object-fit和object-position屬性,進(jìn)行更靈活的設(shè)置視頻的顯示模式和位置。

object-fit屬性

該object-fit CSS屬性指定替換元素的內(nèi)容應(yīng)該如何適應(yīng)到其使用的高度和寬度確定的框

可選的值:

  • object-fit: fill;

  • object-fit: contain;

  • object-fit: cover;

  • object-fit: none;

  • object-fit: scale-down;

每個(gè)值的效果:

object-position屬性

object-position CSS屬性控制替換內(nèi)容位置,和background-position屬性很類似比如:

css代碼


img{
    width: 300px;
    height: 250px;
    border: 1px solid black;
   background-color: silver;
   margin-right: 1em;object-fit: none;
}

#object-position-1 {
   object-position: 10px;
}

#object-position-2 {
   object-position:100%10%;
}

效果

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容