JS&HTML实现音频可视化

 

一、HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Audio Visualizer</title>

    <link rel="stylesheet" type="text/css" href="visualizer.css"/>
    <script type="text/javascript" src="visualizer.js"></script>

</head>
<body>

<div id="content">
    <input type="file" id="file" accept="audio/*"/>
    <canvas id="canvas"></canvas>
    <audio id="audio" controls></audio>
</div>

</body>
</html>

 

二、CSS

/*visualizer.css*/

#file {
    position: fixed;
    top: 10px;
    left: 10px;
    z-index: 100;
}

#canvas {
    position: fixed;
    left: 0;
    top: 0;
    width: 100%;
    height: 100%;
}

audio {
    position: fixed;
    left: 10px;
    bottom: 10px;
    width: calc(100% - 20px);
}

 

三、JS

// visualizer.js

window.onload = function () {

    var file = document.getElementById("file");
    var audio = document.getElementById("audio");

    file.onchange = function () {
        //part1: 画布
        var canvas = document.getElementById("canvas");
        var context = canvas.getContext("2d");

        canvas.width = window.innerWidth;
        canvas.height = window.innerHeight;
        var WIDTH = canvas.width;
        var HEIGHT = canvas.height;

        //part2: 音频
        var files = this.files;//声音文件
        audio.src = URL.createObjectURL(files[0]);
        audio.load();

        //part3: 分析器
        var AudCtx = new AudioContext();//音频内容
        var src = AudCtx.createMediaElementSource(audio);
        var analyser = AudCtx.createAnalyser();

        src.connect(analyser);
        analyser.connect(AudCtx.destination);
        analyser.fftSize = 128;//快速傅里叶变换, 必须为2的N次方

        var bufferLength = analyser.frequencyBinCount;// = fftSize * 0.5

        //part4: 变量
        var barWidth = (WIDTH / bufferLength) - 1;//间隔1px
        var barHeight;

        var dataArray = new Uint8Array(bufferLength);//8位无符号定长数组

        //part5: 动态监听
        function renderFrame() {
            requestAnimationFrame(renderFrame);//方法renderFrame托管到定时器,无限循环调度,频率<16.6ms/次

            context.fillStyle = "#000";//黑色背景
            context.fillRect(0, 0, WIDTH, HEIGHT);//画布拓展全屏,动态调整

            analyser.getByteFrequencyData(dataArray);//获取当前时刻的音频数据

            //part6: 绘画声压条
            var x = 0;
            for (var i = 0; i < bufferLength; i++) {
                var data = dataArray[i];//int,0~255

                var percentV = data / 255;//纵向比例
                var percentH = i / bufferLength;//横向比例

                barHeight = HEIGHT * percentV;

                //gbk,0~255
                var r = 255 * percentV;//值越大越红
                var g = 255 * percentH;//越靠右越绿
                var b = 50;

                context.fillStyle = "rgb(" + r + "," + g + "," + b + ")";
                context.fillRect(x, HEIGHT - barHeight, barWidth, barHeight);

                x += barWidth + 1;//间隔1px
            }
        }

        renderFrame();

        //part7: 播放声音
        audio.play();
    };
};

 

四、警告

The Web Audio autoplay policy will be re-enabled in Chrome 70 (October 2018). Please check that your website is compatible with it.
参考:https://developers.google.com/web/updates/2017/09/autoplay-policy-changes#webaudio

 

参考资料

 

【1】《AnalyserNode API》

【2】《Web API AudioContext》

【3】《Chrome自动播放策略变更》 

【4】《HTML5 requestAnimationFrame》

【5】《Uint8Array数组》

【6】《简明易懂的FFT》 

 

 

 

 

 

  • 8
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
这个任务需要具体的需求说明,因为大屏可视化页面可以有很多不同的类型和功能。以下是一些常见的大屏可视化页面类型和实现方式: 1. 实时数据监控页面:这个页面需要实时获取数据并展示在大屏上,可以使用 WebSocket 或者长轮询等方式实现实时数据获取。数据可以以图表、表格、地图等形式展示。 2. 数据报表页面:这个页面需要从数据库或者其他数据源中获取数据,然后对数据进行分析和处理,最终以报表的形式展示出来。可以使用 BI 工具或者自己编写代码实现数据处理和报表生成。 3. 物联网监控页面:这个页面可以用来展示传感器数据、设备状态等信息,可以通过 MQTT 或者其他协议获取实时数据,并将数据以图表、地图等形式展示。 4. 多媒体展示页面:这个页面可以用来展示图片、视频、音频等多媒体内容,可以通过 HTML5、JavaScript 等技术实现。 无论哪种类型的大屏可视化页面,都需要考虑以下几个方面: 1. 布局和设计:大屏幕展示需要考虑布局和设计,以便用户能够快速、清晰地获取信息。 2. 数据获取和处理:不同类型的页面需要不同的数据获取和处理方式,需要根据具体需求选择合适的技术方案。 3. 数据展示和交互:数据展示需要考虑用户交互,包括缩放、选中、筛选等功能。 4. 性能和可靠性:大屏幕展示需要考虑性能和可靠性,以确保数据能够实时、准确地展示。需要选择合适的硬件、软件和网络设备,以及进行性能测试和容错处理。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值