console
var AudioContext = window.AudioContext || window.webkitAudioContext;
var canvas, ctx;
var audioContext;
var file;
var fileContent;
var audioBufferSourceNode;
var analyser;
var loadFile = function () {
var fileReader = new FileReader();
fileReader.onload = function (e) {
fileContent = e.target.result;
decodecFile();
}
fileReader.readAsArrayBuffer(file);
}
var decodecFile = function () {
audioContext.decodeAudioData(fileContent, function (buffer) {
start(buffer);
});
}
var start = function (buffer) {
if (audioBufferSourceNode) {
audioBufferSourceNode.stop();
}
audioBufferSourceNode = audioContext.createBufferSource();
audioBufferSourceNode.connect(analyser);
analyser.connect(audioContext.destination);
audioBufferSourceNode.buffer = buffer;
audioBufferSourceNode.start(0);
showTip(false);
window.requestAnimationFrame(render);
}
var showTip = function (show) {
var tip = document.getElementById('tip');
if (show) {
tip.className = "show";
} else {
tip.className = "";
}
}
var render = function () {
ctx = canvas.getContext("2d");
ctx.strokeStyle = "#ffff00";
ctx.lineWidth = 5;
ctx.clearRect(0, 0, canvas.width, canvas.height);
var dataArray = new Uint8Array(analyser.frequencyBinCount);
analyser.getByteFrequencyData(dataArray);
var step = Math.round(dataArray.length / 60);
for (var i = 0; i < 10; i++) {
var energy = (dataArray[step * i] / 256.0) * 50;
for (var j = 0; j < energy; j++) {
ctx.beginPath();
ctx.moveTo(20 * i + 2, 200 + 4 * j);
ctx.lineTo(20 * (i + 1) - 2, 200 + 4 * j);
ctx.stroke();
ctx.beginPath();
ctx.moveTo(20 * i + 2, 200 - 4 * j);
ctx.lineTo(20 * (i + 1) - 2, 200 - 4 * j);
ctx.stroke();
}
ctx.beginPath();
ctx.moveTo(20 * i + 2, 200);
ctx.lineTo(20 * (i + 1) - 2, 200);
ctx.stroke();
}
window.requestAnimationFrame(render);
}
window.onload = function () {
audioContext = new AudioContext();
analyser = audioContext.createAnalyser();
analyser.fftSize = 256;
var fileChooser = document.getElementById('fileChooser');
fileChooser.onchange = function () {
if (fileChooser.files[0]) {
file = fileChooser.files[0];
showTip(true);
loadFile();
}
}
canvas = document.getElementById('visualizer');
}
<html>
<head>
<title>HTML5 Audio Visualizing</title>
<style type="text/css">
body {
background-color: #222222
}
input {
color: #ffffff
}
#wrapper {
display: table;
width: 100%;
height: 100%;
}
#wrapper-inner {
display: table-cell;
vertical-align: middle;
padding-left: 25%;
padding-right: 25%;
}
#tip {
color: #fff;
opacity: 0;
transition: opacity 1s;
-moz-transition: opacity 1s;
-webkit-transition: opacity 1s;
-o-transition: opacity 1s;
}
#tip.show {
opacity: 1
}
</style>
<script type="text/javascript" src="./index.js">
</script>
</head>
<body>
<div id="wrapper">
<div id="wrapper-inner">
<p id="tip">Decoding...</p>
<input id="fileChooser" type="file" />
<br>
<canvas id="visualizer" width="800" height="400">Your browser does not support Canvas tag.</canvas>
</div>
</div>
</body>
</html>