audio.player.js音乐播放器(基于soundmanager2 flash API开发)

audio.player.js(内部项目)是一款基于soundmanager2 flash API开发的音乐播放器,采用flash进行播放,界面完全交由用户自己定制。

Usage

<!-- 引入资源文件 -->
<!-- 样式表 -->
<link rel="stylesheet" href="/audio.player.css">
<!-- 依赖库 -->
<script src="/jquery.js"></script>
<script src="/lodash.js"></script>
<!-- 核心库 -->
<script src="/audio.player.js"></script>
<!-- HTML -->
<!-- 播放器容器 -->
<div id="myplayer"></div>
// JS
// 歌单
var playlist = [{
    id: 1, // 歌曲id
    name: '米店', // 歌曲名
    singer: '李志', // 歌手
    url: '/test.mp3', // 歌曲url
    type: 'audio/mp3' // 歌曲类型
}];
// 创建播放器
var cp = cafePlayer({
    // 播放器容器id
    container: 'myplayer',
    // 自定义播放器控件按钮
    icons: {
        play: '<i class="cf cf-play-o"></i>'
        ...
    },
    // 歌曲播放结束回调函数
    onfinish: function() {},
    // 歌曲加载(缓冲)完毕回调函数
    onload: function() {},
    // 歌曲暂停回调函数
    onpause: function() {},
    // 歌曲开始播放回调函数
    onplay: function() {},
    // 歌曲暂停恢复回调函数
    resume: function() {}
});
// 这里作为基础功能演示,事先清空了session storage中的持久化歌曲列表,
// 因为在实际使用中,add功能只会添加歌曲列表中不存在的歌曲
cp.playlist.storage.clear(cp.id);
// 添加歌曲到播放列表
cp.add(playlist);

以上代码实现了播放器的实例化以及歌曲的添加,下面需要对播放器控件进行初始化。这一步将在soundManager flash API初始化后进行:

soundManager.onready(function() {
    // 当soundManager加载完毕后,初始化播放控件
    cp.initPlugins();
});

运行后,点击播放,结果如下:

播放器默认界面

Plugins

控件是播放器功能扩展的一个重要体现,默认的控件如下:

  • 上一首
  • 下一首
  • 播放/暂停
  • 歌曲meta信息(歌曲名,歌手名,当前时间,总时间)
  • 循环模式(列表循环,单曲循环,随机循环)
  • 音量

Extend plugins

audio.player.js为播放器提供了方便的扩展接口,用户只需要按照约定的模板编写控件,然后将编写好的控件js文件合并入audio.player.js后即可,比如我们扩展了如下控件:

<!-- 核心库 -->
<script src="/static/js/audio.player.js"></script>
<!-- 播放列表 -->
<script src="/static/js/player-plugin-playlist.js"></script>
<!-- 下载 -->
<script src="/static/js/player-plugin-download.js"></script>
<!-- 点歌 -->
<script src="/static/js/player-plugin-request.js"></script>

扩展后的播放器示意图如下:

自定义播放器界面

⚠️ Something you need to know first

soundManager {object} 播放器对象,用于各类全局配置
SMSound {object} 声音对象,单首歌曲的声音对象

Params(read only)

  • id {string}
    自定义播放器id(随队列长度增加而自增)

  • loopType {number}
    循环模式
    1: 列表循环
    2: 单曲循环
    3: 随机循环

  • name {string}
    自定义播放器name

  • player {object}
    flash播放器信息

  • player.flashVersion {number}
    soundManager2 flash播放核心版本

  • player.name {string}
    flash播放核心名称(即soundManager2)

  • player.version {string}
    soundManager2版本

  • playlist {object}
    播放列表

  • playlist.items {array}
    播放列表歌曲数组

  • playlist.shuffled {boolean}
    播放列表是否已经随机排序的标记

  • plugins {object}
    播放器控件对象

  • plugins.loop {object}
    循环模式控件jquery对象

  • plugins.meta {object}
    meta信息控件jquery对象

  • plugins.next {object}
    下一首控件jquery对象

  • plugins.playpause {object}
    播放/暂停控件jquery对象

  • plugins.prev {object}
    上一首控件jquery对象

  • plugins.progressbar {object}
    播放时间进度条控件jquery对象

  • plugins.volume {object}
    音量控件jquery对象

  • song {SMSound}

Methods

  • add(src, now)
/**
 * 添加歌曲到播放列表
 * @param  {(object|object[])} src 歌曲资源
 * @param  {boolean}           now 是否添加歌曲后立即播放,默认false
 * @return {array}                 播放列表
 */
  • create(src)
/**
 * 创建资源
 * @param  {object} src 歌曲资源
 * @return {object}     SMSound
 */
  • createSong(url)
/**
 * 创建歌曲
 * @param  {string} url 歌曲地址
 * @return {object}     SMSound
 */
  • del(sId)
/**
 * 从播放列表中删除歌曲
 * @param {(number|number[])} sId 歌曲资源id
 * @return {array}     播放列表
 */
  • initPlugins()
/**
 * 初始化播放器控件
 * @return {object} 控件对象
 */
  • load(src)
/**
 * 装载歌曲
 * @param  {object} src 歌曲资源
 * @return {object}     SMSound
 */
  • next()
/**
 * 下一首
 * @return {object} 下一首歌曲资源
 */
  • pause(song)
/**
 * 暂停正在播放的歌曲
 * @param {object} song SMSound
 * @return {object}     SMSound
 */
  • play(song)
/**
 * 播放已装载歌曲
 * @param {object} song SMSound
 * @return {object}     SMSound
 */
  • playlist.reset(src)
/**
 * 重置播放列表:
 * 1、以当前第一首歌为首,以此进行顺序排序
 * 2、以传入的src歌曲为首,以此进行截断排序(即维持原顺序,无论是列表还是随机)
 * @param  {object} src 歌曲资源
 * @return {array}      播放列表
 */
  • playlist.resetAll()
/**
 * 播放列表按照歌曲添加顺序整个排序
 * 例如,
 * 重置前:[b,d,a,c,e,g,f]
 * 重置后:[a,b,c,d,e,f,g]
 */
  • playlist.shuffle()
/**
 * 播放列表随机排序
 */
  • playlist.storage.clear(id)
/**
 * 清空持久化播放列表
 * @param  {string} id       播放器id
 * @return {array}           播放列表
 */
  • playlist.storage.get(id)
/**
 * 获取持久化播放列表
 * @param  {string} id       播放器id
 * @return {array}           播放列表
 */
  • playlist.storage.set(id, playlist)
/**
 * 播放列表持久化存储
 * @param  {string} id      播放器id
 * @param  {array} playlist 播放列表
 * @return {array}          播放列表
 */
  • playlist.storage.update(playlist)
/**
 * 更新持久化播放列表
 * @param  {array} playlist 播放列表
 * @return {array}          播放列表
 */
  • prev()
/**
 * 上一首
 * @return {object} 上一首歌曲资源
 */
  • resume(song)
/**
 * 恢复已暂停的歌曲
 * @param {object} song SMSound
 * @return {object}     SMSound
 */
  • stop(song)
/**
 * 停止正在播放的歌曲(将重置时间轴为0)
 * @param {object} song SMSound
 * @return {object}     SMSound
 */
  • unload(song)
/**
 * 卸载歌曲
 * 该方法不仅会停止播放当前歌曲,还会取消当前的任何HTTP请求
 * @param {object} song SMSound
 * @return {object}     SMSound
 */

Session storage

audio.player.js采用session storage来存储持久化歌曲列表,持久化歌曲列表始终与UI界面中的歌曲列表相同,即是说持久化歌曲列表,无论是对其增加或者减少歌曲,始终会与UI界面同步更新,保持一致。

playlist.items

playlist.items是audio.player.js的逻辑歌曲列表,用于存储歌曲的逻辑播放顺序。如下所示:

播放列表排序逻辑

可以看到,在执行了下一首next()后,playlist.items中,a被移动到了栈尾,所以,播放器始终播放的是playlist.items栈头的歌曲。

而持久化歌曲列表(即sessionStorage)中的歌曲顺序始终不变。这种机制主要用于在各种的逻辑排序切换的过程中(如列表循环 -> 单曲循环 -> 随机循环 -> 列表循环),或者对歌曲列表的增删操作时,进行两种歌曲列表的比较操作。

Browser compability

IE8+
Chrome
Firefox
360,猎豹,百度,QQ等其他浏览器

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容