本次的分享是一個(gè)基于HTML5標(biāo)簽實(shí)現(xiàn)的一個(gè)自定義視頻播放器。其中實(shí)現(xiàn)了播放暫停、進(jìn)度拖拽、音量控制及全屏等功能。
效果預(yù)覽
點(diǎn)我查看 源碼倉(cāng)庫(kù) 。
核心思路
我相信一定會(huì)有些沒(méi)有接觸過(guò)制作自定義播放器的童鞋對(duì)于 標(biāo)簽的認(rèn)識(shí)會(huì)停留在此。
<video controls="controls" autoplay="autoplay"> <source src="movie.ogg" type="video/ogg" /> </video>
其中controls屬性經(jīng)過(guò)設(shè)定,會(huì)在界面中顯示一個(gè)瀏覽器自帶的控制條。如果對(duì)于UI沒(méi)有要求的需求,其內(nèi)置控制器已經(jīng)可以滿足大部分的需求。當(dāng)然了如果是這樣你們也不會(huì)看到這篇分享了=。=
隱藏控制條并模擬
那么實(shí)現(xiàn)一個(gè)自定義功能的播放器關(guān)鍵就在于,我們不使用原生的控制器,將其隱藏掉之后,在下方同樣的位置通過(guò)html、css來(lái)模擬所需樣式,同時(shí)通過(guò)js來(lái)調(diào)用vedio標(biāo)簽所暴露給我們的接口函數(shù)及屬性,以及檢測(cè)用戶的操作行為來(lái)同步的模擬UI與視頻播放數(shù)據(jù)的相應(yīng)變化。
幾個(gè)核心函數(shù)及屬性的用法
myVid=document.getElementById("video1"); //控制視頻開(kāi)關(guān) myVid.play() //播放 myVid.pause() //暫停 //模擬視頻進(jìn)度條 myVid.currentTime=5; //返回或設(shè)定當(dāng)前視頻播放位置 myVid.duration // 返回視頻總長(zhǎng)度 //模擬視頻音量 myVid.volume //音量 //獲取視頻當(dāng)前狀態(tài)后判斷何時(shí)從loading切換為播放 myVid.readyState //0 = HAVE_NOTHING - 沒(méi)有關(guān)于音頻/視頻是否就緒的信息 //1 = HAVE_METADATA - 關(guān)于音頻/視頻就緒的元數(shù)據(jù) //2 = HAVE_CURRENT_DATA - 關(guān)于當(dāng)前播放位置的數(shù)據(jù)是可用的,但沒(méi)有足夠的數(shù)據(jù)來(lái)播放下一幀/毫秒 //3 = HAVE_FUTURE_DATA - 當(dāng)前及至少下一幀的數(shù)據(jù)是可用的 //4 = HAVE_ENOUGH_DATA - 可用數(shù)據(jù)足以開(kāi)始播放
在所有實(shí)現(xiàn)中的關(guān)鍵點(diǎn),較為繁瑣的是對(duì)于進(jìn)度條的模擬。其中使用了video標(biāo)簽中的currentTime以及duration屬性,通過(guò)當(dāng)前播放時(shí)間與總播放時(shí)間的比值,就可以計(jì)算出進(jìn)度條相對(duì)于總長(zhǎng)的位置。同時(shí)用戶通過(guò)拖拽進(jìn)度條所最后設(shè)置的長(zhǎng)度也可以用來(lái)反向推算出此時(shí)視頻應(yīng)該播放的位置。
拖拽代碼思路
同理音量的控制與其上行為基本一致,故在源碼中作者將音量與進(jìn)度部分通過(guò)不同元素進(jìn)行判斷是進(jìn)行進(jìn)度還是音量的拖拽控制。
通過(guò)查詢(xún)視頻流狀態(tài)控制播放前的加載動(dòng)畫(huà)
核心的控制部分已經(jīng)說(shuō)完了,有興趣的同學(xué)可以去源碼的html中點(diǎn)擊播放,其中被迫有很多零碎的需求,比如點(diǎn)擊暫停,保存音量等等。整個(gè)視頻播放器的基礎(chǔ)功能實(shí)現(xiàn)的還算完善。
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com