成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

張遷 / 446人閱讀

摘要:寫在最前本次的分享是一個(gè)基于標(biāo)簽實(shí)現(xiàn)的一個(gè)自定義視頻播放器。其中實(shí)現(xiàn)了播放暫停進(jìn)度拖拽音量控制及全屏等功能。核心思路我相信一定會(huì)有些沒有接觸過制作自定義播放器的童鞋對(duì)于標(biāo)簽的認(rèn)識(shí)會(huì)停留在此。整個(gè)視頻播放器的基礎(chǔ)功能實(shí)現(xiàn)的還算完善。

寫在最前

本次的分享是一個(gè)基于HTML5標(biāo)簽實(shí)現(xiàn)的一個(gè)自定義視頻播放器。其中實(shí)現(xiàn)了播放暫停、進(jìn)度拖拽、音量控制及全屏等功能。
歡迎關(guān)注我的博客,不定期更新中——

效果預(yù)覽


畫面卡頓請(qǐng)看這個(gè)地址
https://user-gold-cdn.xitu.io...
點(diǎn)我查看源碼倉庫。

核心思路

我相信一定會(huì)有些沒有接觸過制作自定義播放器的童鞋對(duì)于標(biāo)簽的認(rèn)識(shí)會(huì)停留在此。

其中controls屬性經(jīng)過設(shè)定,會(huì)在界面中顯示一個(gè)瀏覽器自帶的控制條。如果對(duì)于UI沒有要求的需求,其內(nèi)置控制器已經(jīng)可以滿足大部分的需求。當(dāng)然了如果是這樣你們也不會(huì)看到這篇分享了=。=

隱藏控制條并模擬

那么實(shí)現(xiàn)一個(gè)自定義功能的播放器關(guān)鍵就在于,我們不使用原生的控制器,將其隱藏掉之后,在下方同樣的位置通過html、css來模擬所需樣式,同時(shí)通過js來調(diào)用vedio標(biāo)簽所暴露給我們的接口函數(shù)及屬性,以及檢測(cè)用戶的操作行為來同步的模擬UI與視頻播放數(shù)據(jù)的相應(yīng)變化。

幾個(gè)核心函數(shù)及屬性的用法
myVid=document.getElementById("video1");
//控制視頻開關(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 - 沒有關(guān)于音頻/視頻是否就緒的信息
//1 = HAVE_METADATA - 關(guān)于音頻/視頻就緒的元數(shù)據(jù)
//2 = HAVE_CURRENT_DATA - 關(guān)于當(dāng)前播放位置的數(shù)據(jù)是可用的,但沒有足夠的數(shù)據(jù)來播放下一幀/毫秒
//3 = HAVE_FUTURE_DATA - 當(dāng)前及至少下一幀的數(shù)據(jù)是可用的
//4 = HAVE_ENOUGH_DATA - 可用數(shù)據(jù)足以開始播放

在所有實(shí)現(xiàn)中的關(guān)鍵點(diǎn),較為繁瑣的是對(duì)于進(jìn)度條的模擬。其中使用了video標(biāo)簽中的currentTime以及duration屬性,通過當(dāng)前播放時(shí)間與總播放時(shí)間的比值,就可以計(jì)算出進(jìn)度條相對(duì)于總長(zhǎng)的位置。同時(shí)用戶通過拖拽進(jìn)度條所最后設(shè)置的長(zhǎng)度也可以用來反向推算出此時(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)度部分通過不同元素進(jìn)行判斷是進(jìn)行進(jìn)度還是音量的拖拽控制。

通過查詢視頻流狀態(tài)控制播放前的加載動(dòng)畫
function ifState() {
    var state = videoSource.readyState
    if(state === 4) { //狀態(tài)為4即可播放
        videoPlayer()
    } else {
        $(".play-sym-wrapper").remove()
        $("body").append("
") //添加loading動(dòng)畫 setTimeout(ifState, 10) } } setTimeout(ifState, 10)

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

最后

慣例po作者的博客,不定時(shí)更新中——
有問題歡迎在issues下交流。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/90677.html

相關(guān)文章

  • Day11 - 定義視頻放器

    摘要:自定義視頻播放器微信公眾號(hào)開發(fā)企業(yè)級(jí)產(chǎn)品全棧開發(fā)速成周末班首期班號(hào)正式開班,歡迎搶座作者簡(jiǎn)介是推出的一個(gè)天挑戰(zhàn)。 Day11 - 自定義視頻播放器 (Node+Vue+微信公眾號(hào)開發(fā))企業(yè)級(jí)產(chǎn)品全棧開發(fā)速成周末班首期班(10.28號(hào)正式開班,歡迎搶座) 作者:?liyuechun 簡(jiǎn)介:JavaScript30 是 Wes Bos 推出的一個(gè) 30 天挑戰(zhàn)。項(xiàng)目免費(fèi)提供了 30 個(gè)視...

    SKYZACK 評(píng)論0 收藏0
  • 2017-07-20 前端日?qǐng)?bào)

    摘要:前端日?qǐng)?bào)精選入門指南工作原理的新功能前端本地存儲(chǔ)數(shù)據(jù)庫實(shí)例教程模塊深入探究調(diào)查問卷中文譯掘金第期構(gòu)建高性能展開收縮動(dòng)畫譯代碼檢查工具對(duì)比前端之旅譯年了,這么多前端框架,你會(huì)怎樣選擇掘金譯不配置,不出事那些坑其一前端面試的大 2017-07-20 前端日?qǐng)?bào) 精選 CSS入門指南-1:工作原理2017 Amsterdam CSS DayWebpack 3 的新功能:Scope Hoisti...

    JessYanCoding 評(píng)論0 收藏0
  • larkplayer: 插件化的 HTML5 放器

    摘要:是一款輕量級(jí)易擴(kuò)展的播放器,是為解決一些中小型的視頻業(yè)務(wù)場(chǎng)景。同時(shí)各插件由于是面向的播放器接口,插件不知道插件的存在,因此能極大地降低各插件功能間的耦合。 larkplayer 是一款輕量級(jí) & 易擴(kuò)展的 html5 播放器,是為解決一些中小型的視頻業(yè)務(wù)場(chǎng)景。這些業(yè)務(wù)不一定需要大而全的解決方案,并且他們往往有自己的定制化需求。 背景 為什么要編寫 larkplayer?(注意,這里面有...

    lijy91 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<