【大結局】《從案例中學習JavaScript》之酷炫音樂播放器(四)


這是之前寫的用H5制作的音樂播放器,前三節其實已經做得差不多了,音軌的制作原理已經在上一節說明,不過一直還沒有和音樂對接。

本章作為該系列的一個完結篇,我會專門把動態音軌的實現代碼貼出來,demo地址會在文章最后給出。

為了盡可能保持條理清晰,我就重新開一個頁面來說明吧。你把本文的代碼拷過去,應該是可以直接運行的。(當然,音樂文件需要換成你本地的)

1. 畫一個demo頁

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>音軌和音樂對接</title>
	</head>
	<body>
		
	</body>
</html>

在這個頁面的head部分添加一個style塊,我就不單獨整css文件了,把所有的樣式都寫在一個頁面吧。

給body添加一個線性背景

body {
	background:-webkit-linear-gradient(top,skyblue 0%,#fff 100%) no-repeat;
    background:linear-gradient(top,skyblue 0%,#fff 100%) no-repeat;
}

這個表示從上往下,上面是天藍色,漸變到下面的純白色。有一個過渡的效果。

界面:

Paste_Image.png

從圖中可以看到,頁面上只有頂部有一條藍色的線,這是因為目前的頁面還沒有任何東西。這個屬性需要你body區域里有實實在在的東西,才能把高度給撐開。

當然,如果你用純色,不使用 linear-gradient ,就沒關系。

比如你直接寫:

body {
    background:lightskyblue;
}

效果:

Paste_Image.png

這樣就沒關系。

OK,繼續,我們給body區域添加一個div,作為我們的音軌盒子。

<div class='box'></div>

設置一下他的css樣式

.box {
	width: 500px;
    height: 275px;
    background: #666;
    position: relative;
    margin: 100px auto;
}

效果:

Paste_Image.png

這樣是不是就有了。

2. 音軌制作

我們還是采用span來制作音軌,具體原理和繪制方法已經在上一節中說明,這里不再贅述,我直接上代碼了。

在body下方添加一個script塊,里面就寫我們的js代碼:

<script>
				
</script>

我們設置每一條音軌的寬度為10px。

var box = document.getElementsByTagName('div')[0]; 	//獲取承載音軌的父盒子
var allWidth = box.clientWidth;//獲取承載音軌盒子的寬度
var len = (allWidth / 10 );	 	//計算一共出現多少條音軌 
var html = '';  				//動態拼接音軌
for(var i = 0;i < len ; i ++){
	html+="<span class='item' style='left:"+(i*10)+"px;background:#fff;'></span>";
}

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

我們先給每一個span添加一個高度,看看效果
css:

.item {
	position:absolute;
	width:10px;
	height:222px;
	left:0px;
	bottom:0px;
    opacity: 0.96;
}

Paste_Image.png

然后,把span的高度設置為0。

好的,音軌盒子差不多就這樣了。

3. 用audio標簽播放音樂

生成默認的audio對象,然后添加到body區域

var audio = document.createElement('audio');
audio.src = 'mp3/01.mp3'
audio.controls = 'controls';
document.body.appendChild(audio);

css:

audio {
	display: block;
    margin: -100px auto;
    width: 500px;
    border-top: 1px solid;
    border-top-color: #d9dee6;
}

Paste_Image.png

我引入了一首音樂,現在點擊播放按鈕,就已經可以播放音樂了。

4. 音軌盒子與音樂對接

這部分涉及到很多H5的屬性,主要就是一個解析的過程,我就直接貼代碼了。

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


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

var flag = null; //控制是否解析的開關變量

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

audio.onplay = function(){
	flag = true;
	//創建解析對象
	var analyser = audioContext.createAnalyser();
	parse(analyser,function(array){
		console.log(array); //打印解析出來的音軌節點
		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);
	});
}

效果:
Paste_Image.png

OK,對接完成了。

我把背景色改了一下,不用漸變色了,還是用純色吧。

這樣就完成了,這算是一個簡單版本的。

不過原理都是一樣的,我已經把這個音軌對接的代碼整合到之前的版本了。

演示站點
http://jacksky.d113.163ns.cn/music/index.html

嗯,音樂播放器系列到此為止就算是結束了,感謝各位的捧場。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM