vue項(xiàng)目實(shí)現(xiàn)m3u8流媒體播放詳細(xì)圖文教程
1.背景
由于項(xiàng)目中視頻文件數(shù)量多,使用原始的mp4格式耗費(fèi)資源,所以采用媒體轉(zhuǎn)換技術(shù)來查看媒體資源,普通的video播放并不適用m3u8以及其他格式的流媒體,本文實(shí)現(xiàn)如何在vue項(xiàng)目中實(shí)現(xiàn)播放流媒體的技術(shù)。
2.插件
原本是想采用Hls.js第三方庫(kù)來手動(dòng)寫一下代碼,但是查到了使用Hls.js封裝的更好看的第三方插件vue3-video-play,我直接就是拿來主義??!
vue3-video-play官網(wǎng):Vue3-video-play | Vue3VideoPlay
3. 安裝
npm安裝:
npm install vue3-video-play --save
yarn安裝:
yarn add vue3-video-play --save
這個(gè)插件本身的包,存在一些引入問題,所以在頁(yè)面中會(huì)直接報(bào)錯(cuò),我們需要在node_modules包下面找到vue3-video-play這個(gè)文件夾,點(diǎn)擊package.json文件,將module引入的文件修改為index.mjs,不明白的話直接查看上一層dist文件夾就知道為何要改了。
4. 在vue組件中使用
因?yàn)槲抑挥袀€(gè)別組件使用,所以按需引入
import vue3videoPlay from 'vue3-video-play' // 引入組件 import 'vue3-video-play/dist/style.css' // 引入css
主要核心代碼就是這些,因?yàn)槲业膙ue組件代碼過多所以提供主要代碼,大致邏輯是這些 :
監(jiān)聽器 (
watch
):watch
是 Vue 的響應(yīng)式系統(tǒng)的一部分,用于監(jiān)控一個(gè)或多個(gè)響應(yīng)式數(shù)據(jù)的變化。- 在這里,它監(jiān)聽的是
showModal
,即一個(gè)響應(yīng)式引用或狀態(tài)變量。
條件判斷 (
newVal && videoUrl.value
):- 只有當(dāng)
showModal
為true
且videoUrl
有值時(shí),才會(huì)執(zhí)行下面的邏輯。這意味著,只有當(dāng)模態(tài)框顯示并且有視頻 URL 的時(shí)候,才會(huì)去處理視頻播放。
- 只有當(dāng)
判斷視頻類型 (
videoUrl.value.endsWith('.m3u8')
):endsWith('.m3u8')
檢查videoUrl
的值是否以.m3u8
結(jié)尾。這通常用于判斷視頻文件格式是否是 HLS(HTTP Live Streaming),一種流媒體協(xié)議。- 如果是
.m3u8
,設(shè)置isM3u8
為true
,并配置options
對(duì)象以支持 HLS 播放。 - HLS 需要特殊的播放器支持,因此我們?cè)O(shè)置
options.src
和options.type
為'm3u8'
。
處理非
.m3u8
視頻:- 如果不是
.m3u8
,意味著視頻是普通格式(如.mp4
)。 - 將
isM3u8
設(shè)置為false
。 - 使用
nextTick
保證 DOM 更新完成后執(zhí)行以下操作:- 設(shè)置視頻元素的高度為 100%。
- 更新視頻元素的
src
屬性以指向視頻 URL。 - 添加事件監(jiān)聽器
loadedmetadata
: - 事件觸發(fā)后自動(dòng)調(diào)用
videoRef.value.play()
播放視頻。
- 如果不是
<n-modal v-model:show="showModal" title="視頻預(yù)覽" positive-text="確認(rèn)" @positive-click="showModal = false"> <div class="w-[600px] rounded-md"> <vue3videoPlay v-if="isM3u8" width="600px" title="視頻預(yù)覽" :src="options.src" :type="options.type" :auto-play="false" /> <div v-else class="h-[550px] object-fill"> <video ref="videoRef" class="w-full bg-black" controls autoplay> <source src="" type="application/x-mpegURL"> </video> </div> </div> </n-modal> const videoUrl = ref(null) const showModal = ref(false) const videoRef = ref(null) const isM3u8 = ref(false) const options = reactive({ src: '', // 視頻源 type: '', // 視頻類型 }) watch(showModal, (newVal) => { if (newVal && videoUrl.value) { if (videoUrl.value.endsWith('.m3u8')) { isM3u8.value = true options.src = videoUrl.value options.type = 'm3u8' } else { isM3u8.value = false nextTick(() => { videoRef.value.style.height = '100%' videoRef.value.src = videoUrl.value videoRef.value.addEventListener('loadedmetadata', () => { videoRef.value.play() }) }) } } })
總結(jié)
到此這篇關(guān)于vue項(xiàng)目實(shí)現(xiàn)m3u8流媒體播放的文章就介紹到這了,更多相關(guān)vue實(shí)現(xiàn)m3u8流媒體播放內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于vue實(shí)現(xiàn)簡(jiǎn)易打地鼠游戲
這篇文章主要為大家詳細(xì)介紹了基于vue實(shí)現(xiàn)簡(jiǎn)易打地鼠游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08詳解在不使用ssr的情況下解決Vue單頁(yè)面SEO問題
這篇文章主要介紹了在不使用ssr的情況下解決Vue單頁(yè)面SEO問題,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-11-11Vue 自定義標(biāo)簽的src屬性不能使用相對(duì)路徑的解決
這篇文章主要介紹了Vue 自定義標(biāo)簽的src屬性不能使用相對(duì)路徑的解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09vue中this.$refs.name.offsetHeight獲取不到值問題
這篇文章主要介紹了vue中this.$refs.name.offsetHeight獲取不到值問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05vue3 setup中defineEmits與defineProps的使用案例詳解
在父組件中定義String、Number、Boolean、Array、Object、Date、Function、Symbol這些類型的數(shù)據(jù),使用defineEmits會(huì)返回一個(gè)方法,使用一個(gè)變量emits(變量名隨意)去接收,本文給大家介紹vue3 setup中defineEmits與defineProps的使用案例,感興趣的朋友一起看看吧2023-10-10