【H5 音樂播放實(shí)例】第五節(jié) 音軌制作

我就不瞎比比了,直接上代碼吧:

//獲取隨機(jī)顏色
function randomColor(){
    var r = Math.floor(Math.random()*256);
    var g = Math.floor(Math.random()*256);
    var b = Math.floor(Math.random()*256);
    return "rgb("+r+","+g+","+b+")";//IE7不支出rgb
};

window.onload = function(){

    //給音樂播放器(audio)添加一個(gè)timeupdate時(shí)間
    document.getElementById("music").ontimeupdate = function(){

        var currentTime = Math.floor(this.currentTime); //獲取當(dāng)前時(shí)間

       
        var m = parseInt(currentTime / 60);//分鐘
        var s = parseInt(currentTime % 60);//秒鐘
        var time = (m<10?("0"+m):m)+":"+(s<10?("0"+s):s); //格式化

        //console.log(time); //打印出來看看

        // 百分比 = 當(dāng)前時(shí)長 ÷ 總時(shí)長 × 100%
        var total = this.duration;//總時(shí)長
        //console.log(currentTime + '=======' + total);
        //console.log( Math.floor(currentTime / total * 100) + "%" );


        document.getElementsByClassName("progress")[0].style.width = Math.floor(currentTime / total * 100) + "%" ;

    }

    //音軌制作

    var box = document.getElementsByClassName('mbox')[0];  //獲取承載音軌的父盒子

    var allWidth = box.clientWidth;//獲取承載音軌盒子的寬度

    var itemWidth = 5;


    var len = (allWidth / itemWidth );     //計(jì)算一共出現(xiàn)多少條音軌 

    var html = '';                  //動態(tài)拼接音軌

    for(var i = 0;i < len ; i ++){
        html+="<span class='item' style='left:"+(i * itemWidth)+"px;background:"+randomColor()+";'></span>";
    }

    box.innerHTML += html;           //添加音軌

    var audio = document.getElementById("music");

    //1:音頻上下文
    window.AudioContext = window.AudioContext || window.webkitAudioContext || window.mozAudioContext || window.msAudioContext;
    /*動畫執(zhí)行的兼容寫法*/
    window.requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.msRequestAnimationFrame;


    //2:初始化音軌對象
    var audioContext = new window.AudioContext();

    var flag = null; //控制是否解析的開關(guān)變量

    //拿到播放器去解析音樂文件
    var audioBufferSouceNode = audioContext.createMediaElementSource(audio);

    audio.onplay = function(){
        flag = true;
        //創(chuàng)建解析對象
        var analyser = audioContext.createAnalyser();
        parse(analyser,function(array){
            console.log(array); //打印解析出來的音軌節(jié)點(diǎn)
            for(var i = 0;i < len ; i ++){
                document.getElementsByClassName('item')[i].style.height = array[i] + 'px';
            }
        });
    }

    audio.onpause = function(){
        for(var i = 0;i < len ; i ++){
            document.getElementsByClassName('item')[i].style.height = 1 + 'px';
        }
        flag = false;
    }


    function parse(analyser,callback){
        if(!flag){
            return;
        }
        audioBufferSouceNode.connect(analyser); 
        analyser.connect(audioContext.destination);
        var array = new Uint8Array(analyser.frequencyBinCount);
        analyser.getByteFrequencyData(array);
        if(callback) callback(array);
        requestAnimationFrame(function(){
            parse(analyser,callback);
        });
    }

}

css:

.item {
    position:absolute;
    width:5px;
    height:1px;
    left:0px;
    bottom:0px;
    opacity: 0.5;
}

效果:

總結(jié)思路

1.獲取mbox的寬度,然后動態(tài)計(jì)算一共有多少條音軌。
2.用H5的音頻解析器去解析當(dāng)前音樂播放的各頻率的音高
3.用這些音高去給每一條音軌動態(tài)地設(shè)置高度height
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標(biāo)準(zhǔn)。 注意:講述HT...
    kismetajun閱讀 28,774評論 1 45
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 14,093評論 1 92
  • 1.培育班風(fēng),一定要從本班學(xué)生的性格出發(fā),走自己的路,建立有自己班級特色的班風(fēng)。 【思考】第一次班主任,我的優(yōu)點(diǎn)在...
    劉敏銳sharply閱讀 857評論 0 0

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