vue-music 关于Player (播放器组件)--播放模式

播放器播放模式有三种,顺序播放,单曲循环,随机播放,定义在vuex 中的字段为 mode。点击切换播放模式的图标。切换模式判断是否为随机播放,如果是随机播放模式,则取得sequenceList 列表数组 。

首先分清楚 sequenceList 是歌单顺序列表,显示在界面上的,playlist 是根据播放模式改变的,顺序播放时playlist  等于sequenceList ,随机播放时playlist  为随机数组列表

利用(shuffle)工具函数。将其随机打乱重组赋值给vuex中的playlist。当改变playlist的时候需要重置 currentIndex ,因为playlist改变为随机播放模式时。currentindex的索引指向的歌曲就不对了。 所以用 resetCurrentIndex 函数判断当前歌曲的id 是否和列表中播放的歌曲的id相同,相同则重新赋值该索引,保证在正在播放当前歌曲的时候切换模式,当前歌曲不被改变

// util.js// 返回最小与最大值之间的随机数,包含最大最小值
function getRandomInt(min,max){
    return Math.floor(Math.random() * (max - min+1) + min)
}

//将数组的副本循环随机打乱重组一个新数组返回
export function shuffle(arr){
    let _arr = arr.slice();
    for(let i=0;i<_arr.length;i++){
        let j = getRandomInt(0,i);
        let t = _arr[i];
        _arr[i] = _arr[j];
        _arr[j] = t;
    }
    return _arr;
}

vuex

export const playMode = {
    sequence:0,
    loop:1,
    random:2
}

const state = {
    mode:playMode.sequence,
}
export default state

player.vue

<i :class="iconMode" @click="changeMode"></i>

iconMode(){
  return this.mode === playMode.sequence ? ‘icon-sequence‘ : this.mode === playMode.loop ? ‘icon-loop‘ : ‘icon-random‘    //设置播放模式图标
},

changeMode(){
  let mode = (this.mode + 1)%3;    //点击循环切换
  this.setPlayMode(mode);    
  let list = null;
  if(mode === playMode.random){
    list = shuffle(this.sequenceList)
  }else{
    list = this.sequenceList;
  }
  this.resetCurrentIndex(list);    //由于playlist 变成随机模式,currentsong是根据currentindex 和playlist 改变的,需要保持currentindex 在随机播放列表的正确位置,以确保当前播放歌曲不变
  this.setPlayList(list);
},
resetCurrentIndex(list){    
  let index = list.findIndex((item) => {
    return item.id === this.currentSong.id
  })
  this.setCurrentIndex(index);
},

单曲循环模式需要监听audio 元素ended 事件,如果end 时模式为loop模式,则设置当前歌曲的currentTime为0,并重新播放,否则按照播放列表进行下一首播放(播放列表此时有可能是顺序列表或者已改变为随机列表)

在music-list 组件中,点击随机播放按钮 提交actions 的randomPlay,设置playlist 为随机播放列表,在选择播放的时候判断当前播放模式

function findIndex(list,song){
  return list.findIndex((item) => {
    return item.id === song.id;
  })
}

export const selectPlay = function({commit,state},{list,index}){
    commit(types.SET_SEQUENCE_LIST, list)
  if (state.mode === playMode.random) {
    let randomList = shuffle(list)
    commit(types.SET_PLAYLIST, randomList)
    index = findIndex(randomList, list[index])
  } else {
    commit(types.SET_PLAYLIST, list)
  }
  commit(types.SET_CURRENT_INDEX, index)
  commit(types.SET_FULL_SCREEN, true)
  commit(types.SET_PLAYING_STATE, true)
}
export const randomPlay = function({commit},{list}){
  commit(types.SET_PLAY_MODE,playMode.random);
  commit(types.SET_SEQUENCE_LIST, list);
  let randomList = shuffle(list)
  commit(types.SET_PLAYLIST, randomList)
  commit(types.SET_CURRENT_INDEX, 0)
  commit(types.SET_FULL_SCREEN, true)
  commit(types.SET_PLAYING_STATE, true)
}
<div class="play" ref="playBtn" @click="random">

random(){
  this.randomPlay({
    list:this.songs
  })
},
...mapActions([
  ‘selectPlay‘,
  ‘randomPlay‘
])

原文地址:https://www.cnblogs.com/catbrother/p/9180369.html

时间: 2024-10-09 09:10:27

vue-music 关于Player (播放器组件)--播放模式的相关文章

从零开始学android&lt;Mediaplayer播放器组件(播放音频).四十八.&gt;

在win计算机中播放视频和音频往往会使用到计算机当中的windowsMediaPlayer播放器,而在Android中则同样会使用mediaplayer播放器对音频和视频进行播放. 下图是mediaplayer的生命周期 dle状态:当使用关键字new实例化一个MediaPlayer对象或者是调用了类中的reset()方法会进入到此状态: End状态:当调用release()方法之后将进入到此状态,此时会释放掉所有占用的硬件和软件资源,并且不会再进入到其他的任何一种状态了: Initialize

iOS 多个播放器同时播放,双击全屏,单击退出全屏

前言:公司需求如下:点击一个按钮播放一个视频,最多同时播放4个:双击某视频让其全屏,单击再恢复原来的样子.IOS的播放器有两种,MPMoviePlayerController,AVAudioPlayer.首先我尝试的是前者,发现并不能让两个视频同时播放,当播放第二个视频的时候,第一个就自动停止了:后来又找了些资料试了试后者,完美解决了这个问题. 多个播放器同时播放,资料参考自:http://ios.jobbole.com/84287/ ,这里介绍的挺详细的,文章后面还有项目可以下载演示,这里就不

jqm视频播放器,html5视频播放器,html5音乐播放器,html5播放器,video开发demo,html5视频播放示例,html5手机视频播放器

最近在论坛中看到了很多实用html5开发视频播放,音乐播放的功能,大部分都在寻找答案.因此我就在这里做一个demo,供大家相互学习.html5开发越来越流行了,而对于视频这一块也是必不可少的一部分.如何让你的网站占据优势,就要看你的功能和用户体验了.html5对video还是做了很多优惠的东西,我们使用起来很得心应手. 在过去 flash 是网页上最好的解决视频的方法,截至到目前还算是主流,像那些优酷之类的视频网站.虾米那样的在线音乐网站,仍然使用 flash 来提供播放服务.但是这种状况将会随

Android中调用系统已安装的播放器来播放网络流媒体视频

实现思路比较简单几行代码就可以搞定,在界面放一个Button或者带有播放图标的imageview,点击事件中调用本地播放器来播放. Uri uri = Uri.parse("http://218.200.69.66:8302/upload/Media/20150327/43bfda1b-7280-469c-a83b-82fa311c79d7.m4v"); // 调用系统自带的播放器来播放流媒体视频 Intent intent = new Intent(Intent.ACTION_VIE

phongap开发中安卓平台上如何调用第三方播放器来播放HLS视频

前文曾经讲了关于在安卓平台上利用phonegap开发播放HLS的解决方案,其实最好的方案就是自己针对HLS视频开发自己的播放器,但是开发播放器是一个浩大的工程,必须对原生安卓开发非常熟悉,并且对视频播放知识需要一定的积累.对于一般开发人员,尤其是web开发人员来讲,这显然不现实,同时这也违背了我们采用phonegap来开发跨平台移动软件的初衷.那么在这种情况下如何达到我们预期的目标呢?答案是调用第三方应用. step1:首先需要在手机上安装一个能够播放HLS协议视频的播放器,例如MXplayer

C#制作视频播放器-player播放器组件

楼主的地址是土豆的地址,本地地址也是可以的. 好了,这时候我们运行,在textbox中添加你要播放视频的地址,音乐地址也是可以的,写好地址后,点击按钮,程序自己就播放了,如图: 现在大家看到,视频大小是跟播放器不对称的,这时我们可以修改视频的分辨率, 具体参考axWindowsMediaPlayer1控件属性介绍:属性/方法名: 说明: [基本属性] URL:String; 指定媒体位置,本机或网络地址 uiMode:String; 播放器界面模式,可为Full, Mini, None, Inv

引入腾讯视频的播放器组件在页面直接播放视频

<div class="vedio_show"> <div id="mod_player_skin"> </div> <!-- 这个div是播放器准备输出的位置 --><!-- 引入腾讯视频播放器组件 --> <script language="javascript" src="http://qzs.qq.com/tencentvideo_v1/js/tvp/tvp.pl

(jsp/html)网页上嵌入播放器(常用播放器代码整理) http://www.jb51.net/article/37267.htm

网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助 这个其实很简单,只要在HTML上添加以上代码就OK了,前提是你的电脑上已经安装了播放器,如RealPlay. 复制代码 代码如下: <embed src="C:/mp3/10.19/画心.mp3" width="480" height="100"02. loop="false"

Simple2D-19(音乐播放器)播放器的源码实现

使用 BASS 和 ImGui 实现音乐播放器 MusicPlayer. 将播放器和一个文件夹关联起来,程序刚开始运行的时候就从该文件夹加载所有音频文件.而文件夹的路径则保存在配置文件中,所以程序的第一步就是读取配置文件. 1.读取配置文件 配置文件以 XML 格式进行储存,使用 TinyXml 库解析: tinyxml2::XMLDocument doc; if ( doc.LoadFile(path.c_str()) != tinyxml2::XML_NO_ERROR ) { this->C