使用VideoJS的基本方法暫時不詳細說明,有很多大佬已經有很詳細的使用方法,本文旨在說明視頻切換時無妨正常渲染的問題。
首先我的項目是視頻頁面不切換,根據左側的樹節點切換而顯示對應節點的視頻。之前找的資料都是說使用dispose()方法,但是我每次使用這個方法之后頁面就無法使用VideoJS的插件了,視頻渲染錯誤如下:
如果不進行dispose()操作,則在切換節點時,頁面報錯已經存在相同的player實例。
解決方法:
在每次實例player的時候,使用不同的id。我使用的是和時間掛鈎的id,接口中新增了一個參數。這樣切換的時候視頻就不會報錯了。
提示,每次節點切換的時候要清空playerlist,同時初始化下空的數據。
效果圖如下:
附具體的代碼:
html部分:
<div class="disassemblyVideo-content-video-screen"> <video :id="'myVideo'+item.id" class="video-js vjs-big-play-centered" ref="videoRef"> <source :src="urlPrefix+item.videoSource" type="video/mp4" /> </video> </div>
js部分:
watch: { // 監聽點擊的節點數據 BOMTreeParams: { handler (newValue) { this.videoLoading = true this.parentNode = newValue.iPartNumber this.playlist.forEach(player => { player.pause() }) this.playlist = [] this.videoList = [] this.getVideo() }, // 深度監聽 deep: true, immediate: true }, // 監聽視頻源數據的變化 videoList: function () { this.$nextTick(function () { console.log('videoList change', this.videoList) this.initVideo() }) } }, // destroyed () { // this.$refs.videoRef.dispose() // }, methods: { // 初始化播放器 initVideo () { // this.disposePlayer() // 初始化視頻方法 循環列表獲取每個視頻的id this.videoList.map((item, i) => { // let flag = true // this.playlist.forEach(player => { // if ('myVideo' + item.itemId === player.id_) { // console.log(player.id_) // flag = false // } // }) // if (flag) { let myPlayer = this.$video('myVideo' + item.id, { // 確定播放器是否具有用戶可以與之交互的控件。沒有控件,啟動視頻播放的唯一方法是使用autoplay屬性或通過Player API。 controls: true, // 自動播放屬性,muted:靜音播放 // autoplay: 'muted', // 建議瀏覽器是否應在<video>加載元素后立即開始下載視頻數據。 preload: 'auto', // 設置視頻播放器的顯示寬度(以像素為單位) width: '273', // 設置視頻播放器的顯示高度(以像素為單位) height: '163', // 封面圖 poster: item.pic, controlBar: { // 自定義按鈕的位置 children: [ { name: 'playToggle' }, { name: 'progressControl' }, { name: 'currentTimeDisplay' }, { name: 'timeDivider' }, { name: 'durationDisplay' }, { name: 'volumePanel', // 音量調整方式橫線條變為豎線條 inline: false }, { name: 'pictureInPictureToggle' // 畫中畫播放模式 }, { name: 'fullscreenToggle' } ] } }) this.playlist.push(myPlayer) // } }) // console.log(this.playlist) }, // 獲取視頻 getVideo () { // this.$loading({ // text: '正在加載中...' // }) // let getParams = { // iPartNumber: this.parentNode // } let formData = new FormData() formData.append('iPartNumber', this.parentNode) this.$api.dataNavigation.loadVideo(formData) .then(res => { this.videoLoading = false // this.$loading().close()// 關閉按鈕轉圈 // console.log(res) if (res.data.code === 10001) { this.videoList = res.data.data.result } }) } }