vue+videojs九宮格切換播放(含源碼)

vuecli中引入videojs進行m3u8視頻播放以及分欄切換唯鸭,內(nèi)容涉及視頻播放哑了、宮格切換舱馅、選中窗口視頻替換功能缰泡。

依賴:videojs、flv.js代嗤、videojs-contrib-hls棘钞、videojs-flvjs-es6、vue-video-player
環(huán)境:node : 14版本干毅,可使用v14.19.1宜猜;vue2

頁面效果

1.jpg

2.jpg

說明:只針對本人項目中用到的功能,代碼較多

1. 示例代碼運行時硝逢,請先把左邊列表里面的視頻地址改成自己的姨拥,代碼視頻鏈接目前為空

  1. 視頻選擇時判斷是否有鏈接,無鏈接時走提示
  2. 根據(jù)分欄數(shù)目以及選中窗口判斷視頻是添加渠鸽、直接替換叫乌、二次替換(涉及到窗口切換時使用)
  3. 監(jiān)聽視頻播放狀態(tài),自定義播放出錯占位徽缚;視頻上遮蓋蒙層進行自定義內(nèi)容顯示和點擊事件

源碼傳送陣

部分代碼

列表視頻點擊選擇的視頻賦值播放

// 判斷分欄情況
                    // 只有一欄 ==== 沒有數(shù)據(jù)進行添加憨奸,有數(shù)據(jù)進行編輯替換
                    if (this.layoutNum == 1) {
                        if (!this.playCodeList.length) {
                            this.$refs.hlsVideoPlayer.handelVideoUrl(vcode, vurl, vname, 0)
                            // 把當(dāng)前的鏈接放進去
                            this.playCodeList.push(vcode)
                            this.playUrlList.push(vurl)
                            this.playNameList.push(vname)
                        } else {
                            // 如果已經(jīng)有正在播放的視頻,進行視頻的替換
                            this.playCodeList = [vcode]
                            this.playUrlList = [vurl]
                            this.playNameList = [vname]
                            this.$refs.hlsVideoPlayer.editUrl(vcode, vurl, vname, 0)
                        }
                    } else {
                        // 多欄情況
                        // 還有播放窗口:當(dāng)選選中窗口數(shù)大于已選中播放的列表
                        if (this.layoutNum > this.playCodeList.length) {
                            // 選中切換的是正在播放的凿试,直接編輯替換
                            if (this.chooseIndex < this.playCodeList.length) {
                                this.$refs.hlsVideoPlayer.editIsPlay(this.chooseIndex, true)
                                this.$set(this.playCodeList, this.chooseIndex, vcode)
                                this.$set(this.playUrlList, this.chooseIndex, vurl)
                                this.$set(this.playNameList, this.chooseIndex, vname)
                                this.$refs.hlsVideoPlayer.resetEdit(vcode, vurl, vname, this.chooseIndex)
                            } else {
                                // 判斷是否是已經(jīng)添加過的
                                // 沒有添加過排宰,直接添加
                                if (this.chooseIndex > this.chooseMaxIndex) {
                                    this.playCodeList.push(vcode)
                                    this.playUrlList.push(vurl)
                                    this.playNameList.push(vname)
                                    this.$refs.hlsVideoPlayer.handelVideoUrl(vcode, vurl, vname)
                                } else {
                                    this.$refs.hlsVideoPlayer.editIsPlay(this.chooseIndex, true)
                                    this.$set(this.playCodeList, this.chooseIndex, vcode)
                                    this.$set(this.playUrlList, this.chooseIndex, vurl)
                                    this.$set(this.playNameList, this.chooseIndex, vname)
                                    this.$refs.hlsVideoPlayer.resetEdit(vcode, vurl, vname, this.chooseIndex)
                                }
                            }
                        } else {
                            // 添加到最后一個的時候,判斷是否是從少窗口切換來的
                            this.$refs.hlsVideoPlayer.editIsPlay(this.chooseIndex, true)
                            this.$set(this.playCodeList, this.chooseIndex, vcode)
                            this.$set(this.playUrlList, this.chooseIndex, vurl)
                            this.$set(this.playNameList, this.chooseIndex, vname)
                            this.$refs.hlsVideoPlayer.resetEdit(vcode, vurl, vname, this.chooseIndex)
                        }

                        this.$refs.hlsVideoPlayer.thisCodeLength = this.playCodeList.length
                    }

分欄窗口切換

問題

如果選中切換的窗口屏幕小于當(dāng)前展示的屏幕數(shù)那婉,直接替換已經(jīng)存在的板甘,把多余的隱藏播放
說明:為什么是隱藏而不是直接銷毀刪除
答:直接刪除會造成再次賦值視頻無法播放的問題

        // 分欄管理選中改變
        changeLayout({ name, nums }) {
            // 當(dāng)前分欄重復(fù)選擇
            if (this.layoutName == name) return
            // 沒有選中視頻的時候,不允許切換分欄
            if (!this.playCodeList.length) return
            // 賦值上一個分欄窗口數(shù)详炬,用作對比
            this.oldLayoutNum = this.layoutNum
            // 賦值頁面的窗口數(shù)
            this.$refs.hlsVideoPlayer.layoutNum = nums

            let hadCodeList = []
            let hadUrlList = []
            let hadNameList = []
            // TODO 暫時沒必要進行虾啦,無鏈接的視頻添加時已進行了判斷處理,此步驟無用
            this.playCodeList.forEach((item, index) => {
                // 剔除為空的情況痕寓,進行數(shù)據(jù)重新添加
                if (item != '') {
                    hadCodeList.push(item)
                    hadUrlList.push(this.playUrlList[index])
                    hadNameList.push(this.playNameList[index])
                }
            })

            // 如果選中切換的窗口屏幕小于當(dāng)前展示的屏幕數(shù)傲醉,直接替換已經(jīng)存在的,把多余的隱藏播放
            // 說明:為什么是隱藏而不是直接銷毀刪除
            // 答:直接刪除會造成再次賦值視頻無法播放的問題
            if (nums < this.layoutNum) {
                // 截取當(dāng)前展示的前幾個
                hadCodeList = hadCodeList.slice(0, nums)
                hadUrlList = hadUrlList.slice(0, nums)
                hadNameList = hadNameList.slice(0, nums)
                // 賦值當(dāng)前
                this.playCodeList = [...hadCodeList]
                this.playUrlList = [...hadUrlList]
                this.playNameList = [...hadNameList]
                this.$refs.hlsVideoPlayer.thisCodeLength = hadCodeList.length

                setTimeout(() => {
                    let chooseMaxIndex = this.chooseMaxIndex
                    chooseMaxIndex = chooseMaxIndex + 1
                    if (chooseMaxIndex == 3 || chooseMaxIndex == 5 || chooseMaxIndex == 7) {
                        chooseMaxIndex = chooseMaxIndex + 1
                    } else {
                        chooseMaxIndex = chooseMaxIndex
                    }
                    for (let i = 0; i < chooseMaxIndex; i++) {
                        if (hadCodeList[i] && hadCodeList[i] != '') {
                            // 修改賦值
                            this.$refs.hlsVideoPlayer.editIsPlay(i, true)
                        } else {
                            this.$refs.hlsVideoPlayer.editIsPlay(i, false)
                        }
                    }
                }, 400)
            } else {
                this.playCodeList = hadCodeList
                this.playUrlList = hadUrlList
                this.playNameList = hadNameList
                this.$refs.hlsVideoPlayer.thisCodeLength = hadCodeList.length

                for (let i = 0; i < hadCodeList.length; i++) {
                    this.$refs.hlsVideoPlayer.editIsPlay(i, true)
                }
            }
            if (nums == this.playCodeList.length) {
                this.$refs.hlsVideoPlayer.chooseIndex = this.playCodeList.length - 1
                this.chooseIndex = this.playCodeList.length - 1
            } else {
                this.$refs.hlsVideoPlayer.chooseIndex = this.playCodeList.length
                this.chooseIndex = this.playCodeList.length
            }

            this.layoutName = name
            this.layoutNum = nums
        },
    },

鏈接選擇替換的幾種處理(子組件頁面)

// 進行視頻替換
        editUrl(code, src, name, index) {
            this.isCanPlay = true
            this.$set(this.urlList[index], 'isPlay', true)
            this.$set(this.urlList[index], 'isEdit', true)
            // this.$set(this.urlList[index], 'isError', false)
            this.$set(this.urlList[index], 'code', code)
            this.$set(this.urlList[index], 'url', src)
            this.$set(this.urlList[index], 'name', name)

            this.$nextTick(() => {
                this.playerList[index].src(this.makeUrlSource(src))
                this.playerList[index].load()
            })
        },
        // 編輯替換:字段設(shè)置
        editIsPlay(index, isPlay) {
            console.log(index)
            if (this.urlList[index]) {
                if (isPlay && this.urlList[index]['isEdit']) {
                    this.$set(this.urlList[index], 'isPlay', isPlay)
                } else {
                    this.$set(this.urlList[index], 'isPlay', isPlay)
                }

                if (!isPlay) {
                    this.$set(this.urlList[index], 'isEdit', false)
                }
            }
        },
        // 編輯替換:視頻替換
        resetEdit(code, src, name, index) {
            if (this.urlList[index]) {
                if (this.urlList[index]['isEdit']) {
                    // 可直接編輯
                    this.editUrl(code, src, name, index)
                } else {
                    // 走銷毀后添加
                    this.handelVideoUrl2(code, src, name, index)
                }
            }
        },

videojs官網(wǎng):https://docs.videojs.com/
樣式相關(guān)參考鏈接:https://blog.csdn.net/maofengwoaini/article/details/120786907
videojs事件監(jiān)聽參考鏈接:https://blog.csdn.net/zhu_zhu_xia/article/details/122577153

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末呻率,一起剝皮案震驚了整個濱河市硬毕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌礼仗,老刑警劉巖吐咳,帶你破解...
    沈念sama閱讀 210,835評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逻悠,死亡現(xiàn)場離奇詭異,居然都是意外死亡韭脊,警方通過查閱死者的電腦和手機童谒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,900評論 2 383
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沪羔,“玉大人饥伊,你說我怎么就攤上這事∧枋危” “怎么了琅豆?”我有些...
    開封第一講書人閱讀 156,481評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長篓吁。 經(jīng)常有香客問我茫因,道長,這世上最難降的妖魔是什么杖剪? 我笑而不...
    開封第一講書人閱讀 56,303評論 1 282
  • 正文 為了忘掉前任冻押,我火速辦了婚禮,結(jié)果婚禮上盛嘿,老公的妹妹穿的比我還像新娘翼雀。我一直安慰自己,他們只是感情好孩擂,可當(dāng)我...
    茶點故事閱讀 65,375評論 5 384
  • 文/花漫 我一把揭開白布狼渊。 她就那樣靜靜地躺著,像睡著了一般类垦。 火紅的嫁衣襯著肌膚如雪狈邑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,729評論 1 289
  • 那天蚤认,我揣著相機與錄音米苹,去河邊找鬼。 笑死砰琢,一個胖子當(dāng)著我的面吹牛蘸嘶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播陪汽,決...
    沈念sama閱讀 38,877評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼训唱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了挚冤?” 一聲冷哼從身側(cè)響起况增,我...
    開封第一講書人閱讀 37,633評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎训挡,沒想到半個月后澳骤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體歧强,經(jīng)...
    沈念sama閱讀 44,088評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,443評論 2 326
  • 正文 我和宋清朗相戀三年为肮,在試婚紗的時候發(fā)現(xiàn)自己被綠了摊册。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,563評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡颊艳,死狀恐怖茅特,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情籽暇,我是刑警寧澤,帶...
    沈念sama閱讀 34,251評論 4 328
  • 正文 年R本政府宣布饭庞,位于F島的核電站戒悠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏舟山。R本人自食惡果不足惜绸狐,卻給世界環(huán)境...
    茶點故事閱讀 39,827評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望累盗。 院中可真熱鬧寒矿,春花似錦、人聲如沸若债。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,712評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蠢琳。三九已至啊终,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間傲须,已是汗流浹背蓝牲。 一陣腳步聲響...
    開封第一講書人閱讀 31,943評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留泰讽,地道東北人例衍。 一個月前我還...
    沈念sama閱讀 46,240評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像已卸,于是被迫代替她去往敵國和親佛玄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,435評論 2 348

推薦閱讀更多精彩內(nèi)容