zoukankan      html  css  js  c++  java
  • HTML5音乐可视化

    环境搭建

    1,安装nodejs和Git,配置环境变量
    2,安装express,npm install -g express-generator
    3,创建项目,express -e music(项目名称)
    4,进入项目,npm install
    5,安装实时监听工具,npm install -g supervisor
    6,测试,supervisor bin/www,浏览器验证127.0.0.1:3000

    sublime运行js文件

    1,打开build system -> new build system新建配置文件

    {
        "cmd": ["node", "--use-strict", "--harmony", "$file"],
        "selector": "source.js"
    }

    保存文件Node.sublime-buildbuild system设置为Node

    音乐的获取与播放

    构建应用的前后端

    1,新建媒体数据文件夹,public/media,把音频数据放入其中
    2,搭建页面CSS框架,/public/stylesheets/index.css
    3,读取页面内容,views/index.ejs
    4,后台路由控制,routes/index.js,获取音乐列表并返回给前段

    ajax请求服务端音频数据

    javascripts下新建文件index.js,在views/index.ejs引用创建的文件

    <script type="text/javascript" src="/javascripts/index.js"></script>

    编辑创建文件,实现点击效果

    <ul id="list">
            <% music.forEach(function(name){ %>
                  <li title="<%= name %>"><%= name %></li>    #设置title属性
            <% }) %>
    </ul>

    解码并播放音频

    AudioContext

    包含各个AudioNode对象以及它们的联系的对象,即audio上下文对象。一个document中只有一个AudioContext创建:var ac = new window.AudioContext();

    属性:

    destination,AudioDestinationNode对象,所有的音频输出聚集地,相当于音频的硬件,所有的AudioNode都直接或间接连接到这里。

    currentTime,AudioContext从创建开始到当前的时间(秒)。

    方法:

    decodeAudioData(arrayBuffer,succ(buffer),err),异步解码包含在arrayBuffer中音频数据

    createBufferSource(),创建autioBufferSourceNode对象

    createAnalyser(),创建AnalyserNode对象

    createGain()/createGainNode(),创建GainNode对象

    AudioBufferSourceNode

    表示内存中的一段音频资源,其音频数据存储在AudioBuffer中(其buffer属性)
    创建:var buffersource = ac.createBufferSource();

    属性:

    buffer,AudioBuffer对象,表示要播放的音频资源数据
    ——子属性:duration,该音频资源的时长(秒)

    loop,是否循环播放,默认false

    onended,可绑定音频播放完毕时调用的时间处理程序

    方法:

    start/noteOn(when=ac.currentTime,offset=0,buration=buffer.duration-offset),开始播放音频。
    when:何时开始播放;
    offset:从音频的第几秒开始播放;
    duration:播放几秒

    stop/noteOff(when=ac.currentTime),结束播放音频

    添加音量控制

    GainNode

    改变音频音量的对象,改变通过它的音频数据所有的sampleframe的信号强度
    创建:var gainNode = ac.createGain()/ac.createGainNode();

    gain,AudioParam对象,通过改变其value值可以改变音频信号的强弱,默认的value属性值为1,通过最小值为0,最大值为1,其value值也可以大于1,小于0

    播放bug修复

    问题:播放第二首歌时,第一首歌依然在播放,主要原因是每次点击音乐列表即调用load("/media/"+this.title),数据解码并播放:

    xhr.onload = function(){
        ac.decodeAudioData(xhr.response, function(buffer){
            var bufferSource = ac.createBufferSource();
            bufferSource.buffer = buffer;
            bufferSource.connect(gainNode);
            bufferSource[bufferSource.start?"start":"noteOn"](0);
        }, function(err){
                    console.log(err);
        });
    }

    解决方法:
    对音频数据赋空值var source = null;,保存上一首歌的解码数据source = bufferSource;,判断执行停止播放source && source[source.stop ? "stop" : "noteoff"](0);

    音乐数据可视化

    AnalyserNode

    音频分析对象,它能实时的分析音频资源的频域和时域信息,但不会对音频流做任何处理
    创建:var analyser = ac.createAnalyser();

    fftSize,设置FFT(FFT是离散傅里叶变换的快速算法,用于将一个信号变换到频域)值得大小,用于分析得到频域,为32 - 2048之间2的整数倍,默认为2048。实时得到的音频频域的数据个数为FFTSize的一半

    frequencyBinCount,FFT值得一半,即实时得到的音频频域的数据个数

    getByteFrequencyData(Uint8Array),复制音频当前的频域数据(数量是FrequencyBinCount)到Uint8Array(8位无符号整型类型化数组)中

    创建Analyser对象:

    var analyser = ac.createAnalyser();
    analyser.fftSize = 512;
    analyser.connect(gainNode);

    连接到分析对象获取数据:bufferSource.connect(analyser);

    实现可视化功能函数:

    function visualizer(){
        var arr = new Uint8Array(analyser.frequencyBinCount);
        analyser.getByteFrequencyData(arr);
        console.log(arr);
    }

    调用visualizer函数:

    利用canvas将音乐数据可视化(柱状图)

    views下加入id<div class="right" id="box"></div>

    控制高度变化:

    var box = $("#box")[0];
    var height, width;
    var canvas = document.createElement("canvas");
    box.appendChild(canvas);
    
    function resize(){
        height = box.clientHeight;
        width = box.clientWidth;
        canvas.height = height;
        canvas.width = width;
    }
    resize();    #调用触发函数
    
    window.onresize = resize;

    利用canvas将音乐数据可视化(圆点图)

    应用优化

    webAudio API

    webAudio核心功能封装为对象


    Copyright © 吴华锦
    雅致寓于高阁渔舟唱晚,古典悠然
    格调外发园林绿树萦绕,馥郁清香
  • 相关阅读:
    FJUT3260
    Codeforces Round #387 (Div. 2)
    poj 1375
    试题 历届试题 蚂蚁感冒(模拟)
    丢手绢(尺取)
    「金」点石成金(dfs)
    小A买彩票(dp)
    不平行的直线
    最少交换次数
    第k小数(桶排序)
  • 原文地址:https://www.cnblogs.com/hanqing/p/5479502.html
Copyright © 2011-2022 走看看