本次的分享是一個基於HTML5<vedio>標籤實現的一個自定義視頻播放器。其中實現了播放暫停、進度拖拽、音量控制及全屏等功能。
歡迎關注個人博客,不按期更新中——css
畫面卡頓請看這個地址
https://user-gold-cdn.xitu.io...
點我查看源碼倉庫。html
我相信必定會有些沒有接觸過製做自定義播放器的童鞋對於<vedio>標籤的認識會停留在此。html5
<video controls="controls" autoplay="autoplay"> <source src="movie.ogg" type="video/ogg" /> </video>
其中controls屬性通過設定,會在界面中顯示一個瀏覽器自帶的控制條。若是對於UI沒有要求的需求,其內置控制器已經能夠知足大部分的需求。固然了若是是這樣大家也不會看到這篇分享了=。=git
那麼實現一個自定義功能的播放器關鍵就在於,咱們不使用原生的控制器,將其隱藏掉以後,在下方一樣的位置經過html、css來模擬所需樣式,同時經過js來調用vedio標籤所暴露給咱們的接口函數及屬性,以及檢測用戶的操做行爲來同步的模擬UI與視頻播放數據的相應變化。github
myVid=document.getElementById("video1"); //控制視頻開關 myVid.play() //播放 myVid.pause() //暫停 //模擬視頻進度條 myVid.currentTime=5; //返回或設定當前視頻播放位置 myVid.duration // 返回視頻總長度 //模擬視頻音量 myVid.volume //音量 //獲取視頻當前狀態後判斷什麼時候從loading切換爲播放 myVid.readyState //0 = HAVE_NOTHING - 沒有關於音頻/視頻是否就緒的信息 //1 = HAVE_METADATA - 關於音頻/視頻就緒的元數據 //2 = HAVE_CURRENT_DATA - 關於當前播放位置的數據是可用的,但沒有足夠的數據來播放下一幀/毫秒 //3 = HAVE_FUTURE_DATA - 當前及至少下一幀的數據是可用的 //4 = HAVE_ENOUGH_DATA - 可用數據足以開始播放
在全部實現中的關鍵點,較爲繁瑣的是對於進度條的模擬。其中使用了video標籤中的currentTime以及duration屬性,經過當前播放時間與總播放時間的比值,就能夠計算出進度條相對於總長的位置。同時用戶經過拖拽進度條所最後設置的長度也能夠用來反向推算出此時視頻應該播放的位置。瀏覽器
//核心代碼示例 var dragDis = 0 var processWidth = xxx //拖拽條總長 $('body').mousedown(function(e) { startX = e.clientX dragDis = startX - leftInit //leftInit爲拖拽條起始點距屏幕左側的距離 dragTarget.css({ //拖拽按鈕 left: dragDis }) dragProcess.css({ //進度條(藍色進度條) width: dragDis }) // 令進度條和拖拽按鈕渲染在同一位置 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 = $('藍色拖拽條').width() / processWidth * duration //拖拽後計算視頻的正確播放位置 })
同理音量的控制與其上行爲基本一致,故在源碼中做者將音量與進度部分經過不一樣元素進行判斷是進行進度仍是音量的拖拽控制。app
function ifState() { var state = videoSource.readyState if(state === 4) { //狀態爲4便可播放 videoPlayer() } else { $('.play-sym-wrapper').remove() $('body').append('<div class="play-sym-wrapper"><img class="play-sym" src="./images/loading.gif"></div>') //添加loading動畫 setTimeout(ifState, 10) } } setTimeout(ifState, 10)
核心的控制部分已經說完了,有興趣的同窗能夠去源碼的html中點擊播放,其中被迫有不少零碎的需求,好比點擊暫停,保存音量等等。整個視頻播放器的基礎功能實現的還算完善。ide
慣例po做者的博客,不定時更新中——
有問題歡迎在issues下交流。函數