video播放m3u8格式連續播放 以及播放列表
阿新 • • 發佈:2019-02-19
解決m3u8播放失敗的問題
當不需要動態載入視訊源的時候 直接引入外掛的地址即可
<div class="videoBox">
<video class="video-js vjs-big-play-centered" controls preload="auto" width="640" height="264" data-setup="{}">
<source id="changeVideo" src="http://1256144954.vod2.myqcloud.com/0df5a8e8vodgzp1256144954/f13da5507447398155231379472/playlist.m3u8" type="application/x-mpegURL">
</video>
</div>
<script src="video.min.js"></script>
<script src="videojs.hls.min.js"></script>
當需要動態載入視訊源
var player = videojs('myPlayer');
var changeVideo = function(vdoSrc){
console.log(vdoSrc);
if(/\.m3u8$/.test(vdoSrc)){//判斷視訊源是否是m3u8的格式
player.src({
src: vdoSrc,
type: 'application/x-mpegURL'//在重新新增視訊源的時候需要給新的type的值
})
}else{
player.src(vdoSrc)
}
player.load();
player.play();
}
var loadVdo = document.getElementById('loadVdo');
var src = 'http://1256144954.vod2.myqcloud.com/0df5a8e8vodgzp1256144954/f13da5507447398155231379472/playlist.m3u8' ;
loadVdo.addEventListener('click',function(){
changeVideo(src);
})
以下是播放列表:(友情支援-小平平)
主要實現:上一個 下一個 點選具體視訊的按鈕切換 是否自動播放>
插入js檔案
<script src="jquery.js"></script>
<script src="video.min.js"></script>
<script src="videojs.hls.min.js"></script>
HTML程式碼部分
- 視訊播放程式碼段
<video id="myPlayer" class="video-js vjs-big-play-centered" controls preload="auto" width="640" height="264" data-setup="{}">
<source id="changeVideo" src="http://1256144954.vod2.myqcloud.com/0df5a8e8vodgzp1256144954/f13da5507447398155231379472/playlist.m3u8"
type="application/x-mpegURL">
</video>
- 自動播放下一節複選框
<label>
<input id="autoNext" type="checkbox" name="autoNext"/>自動播放下一小節
</label>
- 按鈕列表
<div class="chapter">
<button class="playVideo active">1</button>
<button class="playVideo">2</button>
<button class="playVideo">4</button>
</div>
JS部分
- 定義當前播放那個視訊的變數
var currentIndex = 0;//當前播放的小節
- 視訊列表資料
var vdoList = [
{id:1,src:'http://1256144954.vod2.myqcloud.com/0df5a8e8vodgzp1256144954/f13da5507447398155231379472/playlist.m3u8'},
{id:2,src:'video_data/03.mp4'},
{id:4,src:'video_data/iu.mp4'}
];
- 新增上一個 按鈕,新增在暫停鍵的有兩側
var player = videojs('myPlayer',{},function(){
//在選單項暫停鍵前後新增上一節下一節
$(".vjs-play-control").before('<button class="vjs-previous-control" id="previous">上一個</button>');
$(".vjs-play-control").after('<button class="vjs-next-control" id="next">下一個</button>');
});
- 更換當前播放器播放的視訊源
var changeVideo = function(vdoSrc){
//判斷播放的是哪一個
currentIndex = getSrc('current',vdoSrc,vdoList);
console.log(currentIndex)
if(/\.m3u8$/.test(vdoSrc)){//判斷視訊源是否是m3u8的格式
player.src({
src: vdoSrc,
type: 'application/x-mpegURL'//在重新新增視訊源的時候需要給新的type的值
})
}else{
player.src(vdoSrc)//普通視訊
}
player.load();
player.play();
//新增點選樣式 eq是從0開始
$('.playVideo').removeClass('active').eq(currentIndex-1).addClass('active');
}
- 監聽是否結束 根據使用者選擇是否自動播放下一個
player.on('ended',function(){
if( $('#autoNext').is(':checked') && (currentIndex + 1) <= vdoList.length ){
var src = getSrc('src',currentIndex + 1,vdoList)
changeVideo( src );
}
})
- 切換播放源是哪一個小節
$('.playVideo').on('click',function(){
var index = $(this).index() + 1;
src = getSrc('src',index,vdoList);
changeVideo( src );
})
上一個按鈕
這裡用事件委託以及事件冒泡的原理給上一個按鈕繫結點選事件
下一個按鈕同理$('body').on('click','#previous',function(){ if( (currentIndex - 1) > 0 ){ var src = getSrc('src',currentIndex - 1, vdoList); changeVideo( src ); }else{ console.log('沒有上一個了') } })
下一個點選按鈕
//下一個 $('body').on('click','#next',function(){ if( (currentIndex + 1) <= vdoList.length ){ var src = getSrc('src',currentIndex + 1, vdoList); changeVideo( src ); }else{ console.log('沒有下一個了'); } })
獲取資料的src以及當前第幾個視訊
// 獲取陣列中物件的視訊源或者當前id
var getSrc = function(type,params,vdoList){
for( var i = 0;i < vdoList.length; i++){
if( type == 'current' ){
if( vdoList[i].src == params ){
return i+1;
}
}else if( type == 'src' ){
if( (i+1) == params ){
return vdoList[i].src;
}
}
}
}
踩的坑:
- iis搭建本地伺服器,無法播放mp4格式的視訊;
解決辦法:MIME型別,新增副檔名稱”.mp4”,MIME型別:”video/mp4” - 對於當前所在的視訊 currentIndex,
由於視訊列表的id是順序數字,並且還給button添加了data-id屬性,導致currentIndex的值並不十分準確,導致跳轉連結的時候出錯,
解決辦法:currentIndex等於實際的第幾個 例如:點選詳細小節按鈕的時候用index()+1 ,上一個下一個切換,直接-1或者+1