最近研究个新玩意,叫window.AudioContext;不懂?没关系,我也是才接触,这完全可以说个全新领域,
这玩意干啥的?顾名思义,媒体上下文,也就是你媒体的数据分析,就是一串数据啊?那有啥用呢?对,单纯的数据毫无意义,但是如果把数据结合canvas,就会产生神奇的效果(比如百度的echart),这里的AudioContext结合canvas就能产生一个音乐可视化的效果,就是那种手机MP3播放器的效果,又叫音乐可视化;
首先原理:
前端获取到buffer数据,然后运用解析对象,把数据解析,把解析结果放到数组里面,然后连接,最后用canvas画出来;

后台代码

const express = require('express');
const fs = require('fs');
const app = express();
app.get('/app/test', function(req,res) {
fs.readFile('Maksim-克罗地亚狂想曲.mp3', (err, name) => {
if (err) return
res.send(name)
})
})

html部分

<body>
<input type="range" id="radio"> //改变音量的
<canvas id="mycanvas"></canvas>
</body>

首先前端发起请求,请求音乐的流

      function getdata () {
var xhr = new XMLHttpRequest()
xhr.open('get', '/app/test');
xhr.responseType = 'arraybuffer';
xhr.onload = function () {
// 解析后台传来的数据,然后把数据复制到前端的buffer上;
第一个链接的必须是分析者,分析者获取原始数据
ac.decodeAudioData(xhr.response, function (buffer){
var buffesource = ac.createBufferSource();// 创建数据,其中buffersource还有个属性是loop就是音乐是不是循环播放
                  buffesource.buffer = buffer
buffesource.connect(analyser)
buffesource.start(0) //这里star可以三个参数,一次意思是,等待多久播放,从哪里开始播放,播放多久 }, function (err) {
console.log(err)
})
}
xhr.send()
}

然后创建音频控制对象

      var ac = new (window.AudioContext || window.webkitAudioContext)() //这是兼容浏览器的写法
var gainNode = ac[ac.createGain ? 'createGain' : 'createGainNode']() 这个老式和新式api不同
var analyser = ac.createAnalyser() //创建分析者
var size = 128
analyser.fftSize = size * 2;// 这里获取柱子个数就是ffsize的一半
analyser.connect(gainNode)
gainNode.connect(ac.destination)

初始化canvas

        function caninit () {
var line = ctx.createLinearGradient(0,0,0,600)
line.addColorStop(0,'red')
line.addColorStop(.5, 'yellow')
line.addColorStop(1, 'green')
ctx.fillStyle = line
}
caninit()

赋值原始数据到数组

        function asyc () {
var arr = new Uint8Array(analyser.frequencyBinCount)
analyser.getByteFrequencyData(arr)
draw(arr)
nextFrame(asyc)
}
定一个unit8数组,然后把数据赋值进去.注意这里不是不是8位无符号数组,那么analyser.getByteFrequencyData这个方法会报错,说第一个参数必须uint8array

最后画出效果

        function draw (arr) {
ctx.clearRect(0, 0, width, height)
var w = width / size
for (var i = 0; i < arr.length; i++) {
var h = (arr[i] / 512) * height;
ctx.fillRect(w * i, height - h, w *.6, h)
}
}

ok可以了,页面效果是这样的

全部代码正在整理上传,各位有兴趣可以写几个echart的类型表玩玩啊

music, let's go的更多相关文章

  1. Pyhton开源框架(加强版)

    info:Djangourl:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC)风格的 ...

  2. MPlayer

    名称   mplayer − 电影播放器 mencoder − 电影编解码器 概要   mplayer [选项] [文件|URL|播放列表|−] mplayer [选项] 文件1 [指定选项] [文件 ...

  3. python 爬取腾讯微博并生成词云

    本文以延参法师的腾讯微博为例进行爬取并分析 ,话不多说 直接附上源代码.其中有比较详细的注释. 需要用到的包有 BeautifulSoup WordCloud jieba # coding:utf-8 ...

  4. 面经 cisco

    1. 优先级反转问题及解决方法 (1)什么是优先级反转 简单从字面上来说,就是低优先级的任务先于高优先级的任务执行了,优先级搞反了.那在什么情况下会生这种情况呢? 假设三个任务准备执行,A,B,C,优 ...

  5. linux驱动(续)

    网络通信 --> IO多路复用之select.poll.epoll详解 IO多路复用之select.poll.epoll详解      目前支持I/O多路复用的系统调用有 select,psel ...

  6. HttpServletRequest对象(一)

    javaweb学习总结(十)——HttpServletRequest对象(一) 一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HT ...

  7. 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题

    背景起因: 记起以前的另一次也是关于内存的调优分享下   有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...

  8. 先说IEnumerable,我们每天用的foreach你真的懂它吗?

    我们先思考几个问题: 为什么在foreach中不能修改item的值? 要实现foreach需要满足什么条件? 为什么Linq to Object中要返回IEnumerable? 接下来,先开始我们的正 ...

  9. JavaScript之父Brendan Eich,Clojure 创建者Rich Hickey,Python创建者Van Rossum等编程大牛对程序员的职业建议

    软件开发是现时很火的职业.据美国劳动局发布的一项统计数据显示,从2014年至2024年,美国就业市场对开发人员的需求量将增长17%,而这个增长率比起所有职业的平均需求量高出了7%.很多人年轻人会选择编 ...

  10. Angular2入门系列教程3-多个组件,主从关系

    上一篇 Angular2项目初体验-编写自己的第一个组件 好了,前面简单介绍了Angular2的基本开发,并且写了一个非常简单的组件,这篇文章我们将要学会编写多个组件并且有主从关系 现在,假设我们要做 ...

随机推荐

  1. Django实现支付宝支付(沙箱)

    1.安装SDK 点击右侧沙箱当面付接入指导,之后可以看到一个下载SDK的按钮,点击后,会有python的SDK下载链接,但还是属于公测中,也可以通过在cmd里输入以下代码来安装. pip instal ...

  2. ps基本认识

    近来中意ui方面学习,从视频中总结了些许notses,希望能够帮到共同喜欢(❤ ω ❤)的友友 ·基础了解 位图:由像素组成的图片,把位图无限放大以后看到很多小方格,一个方格代表一个像素 矢量图:放大 ...

  3. npm run build 时报错operation not permitted

    1.项目使用vue框架,在npm run build 打包时报错: 访问对应的目录,发现无法打开,原来是文件被其他应用程序占用了,仔细看了一下,xftp文件传输的软件打开着,把它关闭以后,重新运行np ...

  4. linux查看文件命令tail的使用

    一.介绍 linux tail命令用途是依照要求将指定的文件的最后部分输出到终端中,通俗讲来,就是把某个档案文件的最后几行显示到终端上,假设该档案有更新,tail会自己主动刷新,确保你看到最新的档案内 ...

  5. 【Mac】安装 tesserocr 遇到的一些坑(‘cinttypes' file not found)

    问题描述 tesserocr 是 Python 的一个光学字符识别库,它其实是对 tesseract 做的一层 Python API 封装,所以在安装这个库之前我已经用 Homebrew 成功安装好了 ...

  6. 用GO写一个连接比特币JSONRPC接口的程序

    比特币钱包默认是不开启JSONRPC接口的,要在比特币区块文件夹下新建bitcoin.conf这个文件,并写入以下内容 server=1  rpcuser=xxmm  rpcpassword=1234 ...

  7. nohup和&后台运行,进程查看及终止 详解

    nohup 和重定向 功能一样,可用于定时启动 1.nohup 用途:不挂断地运行命令. 语法:nohup Command [ Arg … ] [ & ] 无论是否将 nohup 命令的输出重 ...

  8. ruby学习笔记(1)-puts,p,print的区别

    ruby学习笔记-puts,p,print的区别 共同点:都是用来屏幕输出的. 不同点:puts 输出内容后,会自动换行(如果内容参数为空,则仅输出一个换行符号):另外如果内容参数中有转义符,输出时将 ...

  9. bzoj1011 遥远的行星

    bzoj1011 遥远的行星 原题链接 题解 一道真正的玄学题.... 其实这题根本没法做 首先暴力这么跑:\[ans(s)=\sum_{i=1}^{\lfloor As\rfloor}\frac{M ...

  10. 了解ASP.NET Core 依赖注入,看这篇就够了

    DI在.NET Core里面被提到了一个非常重要的位置, 这篇文章主要再给大家普及一下关于依赖注入的概念,身边有工作六七年的同事还个东西搞不清楚.另外再介绍一下.NET  Core的DI实现以及对实例 ...