濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > 從零實(shí)現(xiàn)一個(gè)自定義html5播放器的示例代碼

從零實(shí)現(xiàn)一個(gè)自定義html5播放器的示例代碼

熱門(mén)標(biāo)簽:高德地圖標(biāo)注賓館位置 杭州營(yíng)銷(xiāo)電銷(xiāo)機(jī)器人供應(yīng)商 電話(huà)機(jī)器人如何 貸款電銷(xiāo)人工和機(jī)器人哪個(gè)好 飛亞外呼系統(tǒng) 百應(yīng)電銷(xiāo)機(jī)器人產(chǎn)業(yè) 西寧智能外呼系統(tǒng)加盟 電視購(gòu)物電銷(xiāo)外呼系統(tǒng) 聯(lián)通400電話(huà)申請(qǐng)

本次的分享是一個(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)可以滿(mǎn)足大部分的需求。當(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è)用戶(hù)的操作行為來(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í)用戶(hù)通過(guò)拖拽進(jìn)度條所最后設(shè)置的長(zhǎng)度也可以用來(lái)反向推算出此時(shí)視頻應(yīng)該播放的位置。

拖拽代碼思路

//核心代碼示例
var dragDis = 0
var processWidth = xxx //拖拽條總長(zhǎng)
$('body').mousedown(function(e) {
    startX = e.clientX
    dragDis = startX - leftInit //leftInit為拖拽條起始點(diǎn)巨屏幕左側(cè)的距離
    dragTarget.css({ //拖拽按鈕
        left: dragDis
    })
    dragProcess.css({ //進(jìn)度條(藍(lán)色進(jìn)度條)
        width: dragDis
    }) // 令進(jìn)度條和拖拽按鈕渲染在同一位置
    videoSource.pause()
}).mousemove(function(e) {
    moveX = e.clientX
    disX = moveX - startX
    var left = dragDis + disX
    if(left > processWidth) {
        left = processWidth
    } else if(left < 0) {
        left = 0
    }
    dragTarget.css({
        left: left
    })
    dragProcess.css({
        width: left
    })
}).mouseup(function(e) {
    videoSource.play()
    videoSource.currentTime = $('藍(lán)色拖拽條').width() / processWidth * duration //拖拽后計(jì)算視頻的正確播放位置
})

同理音量的控制與其上行為基本一致,故在源碼中作者將音量與進(jìn)度部分通過(guò)不同元素進(jìn)行判斷是進(jìn)行進(jìn)度還是音量的拖拽控制。

通過(guò)查詢(xún)視頻流狀態(tài)控制播放前的加載動(dòng)畫(huà)

function ifState() {
    var state = videoSource.readyState
    if(state === 4) { //狀態(tài)為4即可播放
        videoPlayer()
    } else {
        $('.play-sym-wrapper').remove()
        $('body').append('<div class="play-sym-wrapper"><img class="play-sym" src="./images/loading.gif"></div>')
        //添加loading動(dòng)畫(huà)
        setTimeout(ifState, 10)
    }
}
setTimeout(ifState, 10)

核心的控制部分已經(jīng)說(shuō)完了,有興趣的同學(xué)可以去源碼的html中點(diǎn)擊播放,其中被迫有很多零碎的需求,比如點(diǎn)擊暫停,保存音量等等。整個(gè)視頻播放器的基礎(chǔ)功能實(shí)現(xiàn)的還算完善。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

標(biāo)簽:晉中 煙臺(tái) 玉溪 撫州 內(nèi)蒙古 安慶 邯鄲 牡丹江

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《從零實(shí)現(xiàn)一個(gè)自定義html5播放器的示例代碼》,本文關(guān)鍵詞  從,零,實(shí)現(xiàn),一個(gè),自定義,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《從零實(shí)現(xiàn)一個(gè)自定義html5播放器的示例代碼》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于從零實(shí)現(xiàn)一個(gè)自定義html5播放器的示例代碼的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    玛多县| 铜川市| 普安县| 栾川县| 临夏市| 富源县| 历史| 孝义市| 昌邑市| 普兰县| 白朗县| 乡城县| 荔浦县| 梅河口市| 志丹县| 密云县| 临澧县| 靖远县| 罗江县| 玛纳斯县| 奇台县| 靖州| 松溪县| 醴陵市| 高淳县| 福安市| 来安县| 长汀县| 石河子市| 澎湖县| 韶关市| 东台市| 漳浦县| 双城市| 连云港市| 五原县| 吕梁市| 伊宁市| 项城市| 洞头县| 登封市|