audio.player.js音樂播放器(基于soundmanager2 flash API開發(fā))

audio.player.js(內(nèi)部項目)是一款基于soundmanager2 flash API開發(fā)的音樂播放器,采用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' // 歌曲類型
}];
// 創(chuàng)建播放器
var cp = cafePlayer({
    // 播放器容器id
    container: 'myplayer',
    // 自定義播放器控件按鈕
    icons: {
        play: '<i class="cf cf-play-o"></i>'
        ...
    },
    // 歌曲播放結束回調(diào)函數(shù)
    onfinish: function() {},
    // 歌曲加載(緩沖)完畢回調(diào)函數(shù)
    onload: function() {},
    // 歌曲暫停回調(diào)函數(shù)
    onpause: function() {},
    // 歌曲開始播放回調(diào)函數(shù)
    onplay: function() {},
    // 歌曲暫停恢復回調(diào)函數(shù)
    resume: function() {}
});
// 這里作為基礎功能演示,事先清空了session storage中的持久化歌曲列表,
// 因為在實際使用中,add功能只會添加歌曲列表中不存在的歌曲
cp.playlist.storage.clear(cp.id);
// 添加歌曲到播放列表
cp.add(playlist);

以上代碼實現(xiàn)了播放器的實例化以及歌曲的添加,下面需要對播放器控件進行初始化。這一步將在soundManager flash API初始化后進行:

soundManager.onready(function() {
    // 當soundManager加載完畢后,初始化播放控件
    cp.initPlugins();
});

運行后,點擊播放,結果如下:

播放器默認界面

Plugins

控件是播放器功能擴展的一個重要體現(xiàn),默認的控件如下:

  • 上一首
  • 下一首
  • 播放/暫停
  • 歌曲meta信息(歌曲名,歌手名,當前時間,總時間)
  • 循環(huán)模式(列表循環(huán),單曲循環(huán),隨機循環(huán))
  • 音量

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}
    循環(huán)模式
    1: 列表循環(huán)
    2: 單曲循環(huán)
    3: 隨機循環(huán)

  • 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}
    播放列表歌曲數(shù)組

  • playlist.shuffled {boolean}
    播放列表是否已經(jīng)隨機排序的標記

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

  • plugins.loop {object}
    循環(huán)模式控件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)
/**
 * 創(chuàng)建資源
 * @param  {object} src 歌曲資源
 * @return {object}     SMSound
 */
  • createSong(url)
/**
 * 創(chuàng)建歌曲
 * @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的邏輯歌曲列表,用于存儲歌曲的邏輯播放順序。如下所示:

播放列表排序邏輯

可以看到,在執(zhí)行了下一首next()后,playlist.items中,a被移動到了棧尾,所以,播放器始終播放的是playlist.items棧頭的歌曲。

而持久化歌曲列表(即sessionStorage)中的歌曲順序始終不變。這種機制主要用于在各種的邏輯排序切換的過程中(如列表循環(huán) -> 單曲循環(huán) -> 隨機循環(huán) -> 列表循環(huán)),或者對歌曲列表的增刪操作時,進行兩種歌曲列表的比較操作。

Browser compability

? IE8+
? Chrome
? Firefox
? 360,獵豹,百度,QQ等其他瀏覽器

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,786評論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,656評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,697評論 0 379
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,098評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,855評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,254評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,322評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,473評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,014評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,833評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,016評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,568評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,273評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,680評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,946評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,730評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,006評論 2 374

推薦閱讀更多精彩內(nèi)容