music, let's go

最近研究个新玩意,叫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

时间: 2024-11-02 02:00:08

music, let's go的相关文章

千年不曾看懂《道德经》,直至有了《道德图》!--作者:南山空同

第一章:知道识易 本义: 道,可道,非常道.名,可名,非恒名.无名,天地之始:有名,万物之母. 故常无欲,以观其妙:常有欲,以观其徼.此两者同出而异名,同谓之玄,玄之又玄,众妙之门. 通述: 世间的一切规律,都是能够被掌握的,但这些规律,却是不断的发生变化的.我们可以通过一些表面现象,来认知这些规律,我们为了方便识别事物,会给他们命名,来加以区分,但这些名词所包括的内容,也并非一成不变的. 世间事物,本来是不需要通过命名来加以区分的,当我们给一些事物命名,是我们开始认识世间万物的起始.如果我们心

楞严经白话——14.10.10

楞严经 大佛顶如来密因修证了义诸菩萨万行首 楞严经卷一 唐朝中天竺国(印度)沙门(出家人)般剌密谛 主译 乌苌国(北印度)沙门(出家人)弥伽释迦 译语 菩萨戒弟子 前正议大夫 同中书门下 平章事 清河县人 房融 执笔记录 (楞严经,原藏于龙宫,胜龙菩萨到龙宫说法,见龙藏中有此经,披阅之下,叹为希有,遂默诵而出,录呈印度国王,国王视其为国宝,严禁外流.般剌密 谛尊者,弘法愿深,两次冒险,思送中国以求宏扬,不幸皆为关卡查禁.尊者乃费数年时间,以蝇头小字书于腊纸之上,剖膊藏于肉中,方得过关航海而来,于

Java基础知识精华部分(个人总结)

写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java语言代码把思路体现出来. 学习新技术的四点: 1,该技术是什么? 2,该技术有什么特点(使用注意): 3,该技术怎么使用.demo 4,该技术什么时候用?test. ------------------------------------------------------------------------------------

ABAP/4 技术总结 V3.0

SAP --ABAP/4 技术总结 V3.0 2014-10-14 --江正军 1.      基础... 1 1.1. 基本数据类型... 1 1.1.1.        P类型(压缩型)数据... 1 1.2.           TYPE.LIKE. 2 1.3.           DESCRIBE. 3 1.4.           字符串表达式... 3 1.5.           Data element.Domain. 4 1.6.           词典预定义类型与ABAP

安装Windows7系统时,提示:缺少所需的CD/DVD驱动器设备驱动程序

      测试机型:HP probook 430 g3       系统:Windows 7 Pro x64 现在笔记本电脑主板集成的USB口大多为3.0版本,而且一些厂商为了追求PC的轻薄,不再集成光驱,所以我们在安装系统时,一般只能通过U盘或U口外接光驱. 而当我们因为需要(安装OEM系统),在通过刻录软件(如UltraISO)将系统写入U盘或光盘的方式安装系统时,此时问题就可能悄悄出现了:因为Win7官方原版系统没有集成USB3.0驱动,所以可能的报错如下: 点击"浏览"或通过

solr分布式索引【实战一、分片配置读取:工具类configUtil.java,读取配置代码片段,配置实例】

1 private static Properties prop = new Properties(); 2 3 private static String confFilePath = "conf" + File.separator + "config.properties";// 配置文件目录 4 static { 5 // 加载properties 6 InputStream is = null; 7 InputStreamReader isr = null;

win7设置固定IP重启后无法上网,ipconfig显示为自动配置IPV4 169.254的地址

近日安装原版Win7系统打完网卡驱动补丁后,给电脑设置了固定的IP地址后一切正常,但是电脑重启后发现上不了网了,右下角网络图标有个感叹号,打开网络和共享中心-->本地连接-->详细信息-->发现IPv4的地址与ipconfig /all得到的IP地址一致,均显示为:自动配置IPv4地址:169.254.123.188(首选) 但是查看本地连接-->属性里看到之前设置的固定IP地址是没有问题的, 所以想到了应该是电脑启用了自动配置IPv4功能,导致了固定IP无法分配给电脑, 尝试用命

Java TM 已被阻止,因为它已过时需要更新的解决方法

公司的堡垒机需要通过浏览器登陆,且该堡垒机的网站需要Java的支持,最近通过浏览器登陆之后总是提示"java TM 已被阻止,因为它已过时需要更新的解决方法"导致登陆之后不能操作, 但是操作系统中确实已经安装了比较新的JDK,安装的JDK版本是jdk-7u67-windows-i586,因为太烦人,所以决定搞清楚报错的原因,一劳永逸,彻底解决这个问题 准备工作:安装JDK,安装版本jdk-7u67-windows-i586.exe,因为机器的Eclipse还依赖64位的JDK,所以另安

使用R语言计算均值,方差等

R语言对于数值计算很方便,最近用到了计算方差,标准差的功能,特记录. 数据准备 height <- c(6.00, 5.92, 5.58, 5.92) 1 计算均值 mean(height) [1] 5.855 2 计算中位数 median(height) [1] 5.92 3 计算标准差 sd(height) [1] 0.1871719 4 计算方差 var(height) [1] 0.03503333 5 计算两个变量之间的相关系数 cor(height,log(height)) [1] 0

mysqld服务启动失败, Failed to restart mysqld.service: Unit not found.

-bash-4.2# service mysqld restart Redirecting to /bin/systemctl restart mysqld.serviceFailed to restart mysqld.service: Unit not found. 并不存在 mysqld 的服务, -bash-4.2# -bash-4.2# chkconfig -list -list: unknown option -bash-4.2# chkconfig --list Note: Thi