【JS】video播放m3u8格式连续播放 以及播放列表

解决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);
})

插件下载地址:https://github.com/videojs/videojs-contrib-hls/releases/tag/v5.14.1
官网案例地址:http://videojs.github.io/videojs-contrib-hls/

以下是播放列表:(友情支持-小平平)
主要实现:上一个 下一个 点击具体视频的按钮切换 是否自动播放>

插入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;
			}
		}	
	}
}

踩的坑:

  1. iis搭建本地服务器,无法播放mp4格式的视频;
    解决办法:MIME类型,添加文件扩展名称".mp4",MIME类型:“video/mp4”
  2. 对于当前所在的视频 currentIndex,
    由于视频列表的id是顺序数字,并且还给button添加了data-id属性,导致currentIndex的值并不十分准确,导致跳转链接的时候出错,
    解决办法:currentIndex等于实际的第几个 例如:点击详细小节按钮的时候用index()+1 ,上一个下一个切换,直接-1或者+1
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值