---恢復內容開始---css
Html5音樂可視化之音樂的獲取和播放html
最近沉迷與數據可視化沒法自拔,可是本身的水平實在不夠,因此先從一些小Gimmicks開始吧!前端
下面來一張應用核心結構圖感覺如下:前端(瀏覽器)從服務器上獲取音頻數據,獲取數據以後調用一個WebAudio,WebAudio一方面要播放音頻數據,一方面要分析音頻數據,而且將分析的音頻數據傳遞給canvans,canvans拿到數據以後就將它可視化。node
看着這些個步驟是否是以爲很簡單,然而事實並非這樣的,接下來就跟着我一塊兒去實現這個小項目吧!git
首先,咱們要把大方向把握住,要明白整個項目實現的流程:github
1.音頻獲取以及播放:前端界面,node服務端構建,webaudio相關api音頻數據獲取並播放;web
2.音頻可視化:webaudio相關api分析音頻數據,canvans根據將其可視化;ajax
3.應用優化(代碼優化,效果優化,界面響應式優化);express
接下來就是實操啦!npm
一.構建應用先後端:(我是在windows平臺上構建的)
1.先安裝了git base,而後從官網下載了Node.js的Windows Installer,安裝完成後,想驗證是否nodejs安裝成功,便經過git base 的窗口輸入:node -v,可是卻返回:sh.exe": node :command not found。
去網上搜索了一番,說這種問題通常就是環境變量的問題致使的,而後選擇『計算機』-『屬性』-『高級系統設置』-『環境變量』,先查看了『系統變量』部分,發現安裝後確實在系統變量的Path後追加了個人安裝路徑,即:C:\Program Files\nodejs;而後,我打開『用戶環境變量』部分查看了下Path的值,發如今最後系統自動加入了C:\Users\s94983\AppData\Roaming\npm,發現環境變量都已經默認設置了,可是爲何上面的輸入不能反饋版本信息呢?
經過查找,我嘗試在『用戶環境變量』部分的Path下再追加C:\Program Files\nodejs,而後關閉掉git base,從新打開後再次輸入node -v,此次終於能成功反饋版本信息了,問題解決!
綜上須要說明一點,修改path後,須要從新打開git base,若是你是用dos窗口輸入命令(node -v)也是同樣,若是不關閉,從新打開,仍是會返回sh.exe": node :command not found。
2.可是可能仍是會存在問題:npm命令不能在git bash中使用
Bingo@DESKTOP-19C7BJT MINGW64 ~
$ npm -v
bash: npm: command not found
上網查詢得知安裝完nodejs以後配置windows環境變量只能保證在命令行工具中可使用npm,若是想在git bash中使用須要再安裝一遍
Bingo@DESKTOP-19C7BJT MINGW64 ~
$ git clone --recursive git://github.com/isaacs/npm.git
Cloning into 'npm'...
remote: Counting objects: 63481, done.
remote: Compressing objects: 100% (23/23), done.
remote: Total 63481 (delta 5), reused 0 (delta 0), pack-reused 63458
Receiving objects: 100% (63481/63481), 32.37 MiB | 399.00 KiB/s, done.
Resolving deltas: 100% (35818/35818), done.
Checking connectivity... done.
Checking out files: 100% (3096/3096), done.
Bingo@DESKTOP-19C7BJT MINGW64 ~
$ cd npm
Bingo@DESKTOP-19C7BJT MINGW64 ~/npm (latest)
$ node cli.js install npm -gf
Bingo@DESKTOP-19C7BJT MINGW64 ~/npm (latest)
$ npm -v
3.最後要提醒,若是出現:npm ERR! Error: EPERM: operation not permitted這樣的錯誤,解決方法是:
a.最簡單的方法以下:
windows + X 組合鍵就能夠打開下圖
選擇要管理員運行的請選框起來的第二個也能夠按windows+x+a
b.或者,使用搜索cmd,打開以後,選擇"使用管理員權限運行CMD";
但問題是,這種方式須要每次都這樣打開,我但願默認可以就是管理員方式運行。其實也有一勞永逸的方法,以下;
c.修改註冊表;
Win+R --輸入 regedit,打開註冊表,找到如下位置: HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
,新建一個字符串值,命名爲"c:\windows\system32\cmd.exe",通常狀況下,cmd.exe都安裝在C盤
而後右鍵--修改 -- 數值數據寫入「RUNASADMIN」,肯定 !
或者,也能夠採用註冊表導入的方式操做,以下:
直接複製下面內容(系統安裝在C盤32位爲準):
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers]
"c:\\windows\\system32\\cmd.exe"="RUNASADMIN"
打開記事本,複製粘貼入以上代碼,另存爲hao.reg,而後雙擊導入註冊表便可。
OK,這下咱們Win+R輸入cmd,啓動時就已經默認是管理員身份了。
d.修改文件目錄全部者: 進入nodejs的安裝目錄 (默認是 C:\Program Files\nodejs),或者C:\Program Files;
在nodejs上右鍵打開屬性;
選擇安全-->高級,這時候會看到全部這是SYSTEM,選擇"修改";
輸入你目前的帳戶名稱,並檢查OK以後,OK保存;
4.全局安裝express:
5.選擇一個目錄做爲項目目錄:(e:/GitHub/music)
express -e music
6.
.
7.安裝一個實時監聽的小工具:supervisor
8.實時監測www這個項目
當看到下面這個界面,就說明能夠訪問了:
9.express默認訪問的是3000端口,因此在瀏覽器中輸入:127.0.0.1:3000便可訪問:
當出現這個界面的時候,說明後臺已經構建好了。
二.前端界面的實現:
1.用sunlime打開上面構建的music文件。
2.在index.ejs中搭建界面的大體輪廓,代碼以下:
<!DOCTYPE html> <html> <head> <title><%= title %></title> <link rel='stylesheet' href='/stylesheets/index.css' /> </head> <body> <header> <h1><%= title %></h1> </header> <div class="left"> <ul>
//用循環語句把文件中歌曲的名字上傳到界面 <% music.forEach(function(name){%> <li><%=name%></li> <%})%> </ul> </div> <div class="right"></div> </body> </html>
3.接下來要給輪廓穿上衣服:
*{ padding: 0; margin: 0; box-sizing: border-box; } html, body{ height: 100%; } body { font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; background: #000; color: #fff; text-align: center; } header, .left, .right{ position: absolute; } header{ left: 10px; top: 10px; right: 10px; height: 150px; border:solid #fff 1px; } header h1{ font-size: 40px; height: 60px; line-height: 60px; } .left{ left: 10px; top: 170px; bottom: 10px; width: 200px; border: solid #fff 1px; } .left ul{ overflow: auto; } .left ul li{ height: 30px; line-height: 30px; cursor: pointer; } .left ul li.selected{ color: green; } .right{ top: 170px; right: 10px; bottom: 10px; left: 220px; border: solid #fff 1px; }
3.獲取每個音頻文件的名字:
var express = require('express'); var router = express.Router(); var path=require("path"); var media=path.join(__dirname,"../public/media"); /* GET home page. */ router.get('/', function(req, res) { var fs=require("fs"); fs.readdir(media,function(err,names){ if (err) { console.log(err); }else{ res.render('index',{title:'special Music',music:names}); } }); }); module.exports = router;
4.ajax請求服務端獲取音頻資源數據:
//這一段是爲了讓界面實現鼠標覆蓋時發生改變
function w(s){ return document.querySelectorAll(s); } var lis=w("#list li"); for(var i=0;i<lis.length;i++){ lis[i].onclick=function(){ for(var j=0;j<lis.length;j++){ lis[j].className=""; } this.className="selected"; load("/media/"+this.title); } } //這一段是ajax請求服務端獲取音頻資源數據 var xhr=new XMLHttpRequest(); function load(url){ xhr.open("GET",url); xhr.responseType="arraybuffer"; xhr.onload=function(){ console.log(xhr.response); } xhr.send(); }
5.(該項目的核心)解碼而且播放音頻資源:WebAudio API
代碼實現部分:
---恢復內容結束---