html5 audio之分享版音樂(lè)播放器

關(guān)于項(xiàng)目

該項(xiàng)目基于HTML5 audio api 完成的一個(gè)分享版簡(jiǎn)易音樂(lè)播放器。

關(guān)于歌詞

Lrc歌詞文件:大部分MP3顯示歌詞的方法使用的是lrc格式的歌詞文件,也是當(dāng)前網(wǎng)絡(luò)上最流行的一種歌詞格式。LRC通常有合并和展開兩種形式:合并LRC歌詞是將歌詞內(nèi)容相同的合并起來(lái),多個(gè)時(shí)間標(biāo)簽對(duì)應(yīng)一句歌詞;展開LRC是一個(gè)時(shí)間標(biāo)簽對(duì)應(yīng)一句歌詞。合并LRC可以節(jié)省磁盤空間。


lrc_1.png

lrc_2.png

解析歌詞

parseLyric: function(text){
    //將文本分隔成一行一行,存入數(shù)組
    var lines = text.split('\n'),
        //用于匹配時(shí)間的正則表達(dá)式,匹配的結(jié)果類似[xx:xx.xx]
        pattern = /\[\d{2}:\d{2}.\d{2}\]/g,
        //保存最終結(jié)果的數(shù)組
        result = [];
    //去掉不含時(shí)間的行
    while (!pattern.test(lines[0])) {
        lines = lines.slice(1);
    };
    //上面用'\n'生成生成數(shù)組時(shí),結(jié)果中最后一個(gè)為空元素,這里將去掉
    lines[lines.length - 1].length === 0 && lines.pop();
    lines.forEach(function(v /*數(shù)組元素值*/ , i /*元素索引*/ , a /*數(shù)組本身*/ ) {
        //提取出時(shí)間[xx:xx.xx]
        var time = v.match(pattern),
            //提取歌詞
            value = v.replace(pattern, '');
        //因?yàn)橐恍欣锩婵赡苡卸鄠€(gè)時(shí)間,所以time有可能是[xx:xx.xx][xx:xx.xx][xx:xx.xx]的形式,需要進(jìn)一步分隔
        time.forEach(function(v1, i1, a1) {
            //去掉時(shí)間里的中括號(hào)得到xx:xx.xx
            var t = v1.slice(1, -1).split(':');
            //將結(jié)果壓入最終數(shù)組
            result.push([parseInt(t[0], 10) * 60 + parseFloat(t[1]), value]);
        });
    });
    //最后將結(jié)果數(shù)組中的元素按時(shí)間大小排序,以便保存之后正常顯示歌詞
    result.sort(function(a, b) {
        return a[0] - b[0];
    });
    return result;
}

解析歌詞

var lyric = []; //歌詞結(jié)果數(shù)組
this.audio.addEventListener('timeupdate', function(){
    var curTime = this.currentTime;             
    lyric.forEach(function(v, i){
        if (curTime > v[0]) { // 當(dāng)前時(shí)間大于歌詞對(duì)應(yīng)的時(shí)間,高亮顯示歌詞
            $('#line-'+ (i>0 ? i-1 : i)).classList.remove('current');
            $('#line-'+ i).classList.add('current');  // 設(shè)置當(dāng)前歌詞樣式
            $lyric.style.transform = 'translate3d(0,-'+ 42*i +'px,0)'; // 每行歌詞行高是42px
        }
    });
});

audio api

  • 屬性
  1. currentTime 設(shè)置或返回音頻/視頻中的當(dāng)前播放位置(以秒計(jì))
  2. duration 返回當(dāng)前音頻/視頻的長(zhǎng)度(以秒計(jì))
  • 事件
  1. canplay 當(dāng)瀏覽器可以播放音頻/視頻時(shí)
  2. play 當(dāng)音頻/視頻已開始或不再暫停時(shí)
  3. ended 當(dāng)目前的播放列表已結(jié)束時(shí)
  4. timeupdate 當(dāng)目前的播放位置已更改時(shí)

項(xiàng)目預(yù)覽

1. npm install
2. npm run dev
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,314評(píng)論 4 61
  • 技術(shù)點(diǎn):ES6+Webpack+HTML5 Audio+Sass這里,我們將一步步的學(xué)到如何從零去實(shí)現(xiàn)一個(gè)H5音樂(lè)...
    Sco77閱讀 10,022評(píng)論 3 27
  • 陪你去看雨 雨卻只下了一分鐘 陪你去沖浪 海卻在那時(shí)突然安靜 陪你發(fā)呆 陪你百無(wú)聊賴 你卻突然有了天馬行空的安排 ...
    世無(wú)良貓閱讀 276評(píng)論 0 1
  • 無(wú)論你遇見誰(shuí),他都是你生命該出現(xiàn)的人,絕非偶然,他一定會(huì)教會(huì)你一些什么。找一個(gè)能隨時(shí)隨地和你聊天的人真的很難。當(dāng)你...
    D040小黎佛山閱讀 217評(píng)論 2 5
  • 安眠藥之所以是個(gè)好東西,是因?yàn)樗呤莻€(gè)好東西。 吞下兩粒安眠藥,迅速地墜入無(wú)邊無(wú)際的黑暗中,寧?kù)o、安全,白天懼怕的...
    流水賬專業(yè)撰稿人閱讀 823評(píng)論 0 4

友情鏈接更多精彩內(nèi)容