我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Web Audi怎么绘制音频图谱

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Web Audi怎么绘制音频图谱

本文小编为大家详细介绍“Web Audi怎么绘制音频图谱”,内容详细,步骤清晰,细节处理妥当,希望这篇“Web Audi怎么绘制音频图谱”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

实现思路

先介绍下小编的整体思路吧。所谓的音频图谱,其实只是将声音的响度具象化为一个波形图,响度高对应的波形高,响度低波形也就低。所以第一步,我们可以通过xhr拿到一个音频文件的数据。那么,第二步便是如何处理这组数据,让数据能够比较真实的反应音频的响度。这时候就需要前端的Web Audio Api来发挥作用了,具体如何处理,我们后面详细说明。完成数据处理之后,最后一步就是需要根据数据绘制出波形图,这里我们使用canvas来做波形图的绘制。

获取音频文件

首先,我们利用fetch,来获取一个线上音频。这里,我们借用一下wavesuffer官网demo中用的线上音频来做示范。

// 音频urllet audioUrl = 'https://wavesurfer-js.org/example/media/demo.wav';// 创建音频上下文let audioCtx = new (window.AudioContext || window.webkitAudioContext)();// 创建音频源let source = audioCtx.createBufferSource();fetch(audioUrl, {  method: 'GET',  responseType: 'arraybuffer',}).then(res => {  return res.arrayBuffer();}).then(data => {  // 处理音频数据  initAudio(data);});

利用Web Audio Api 处理音频数据

拿到音频数据之后,我们需要利用Web Audio Api,来处理音频数据,实现音频的播放,暂停等操作以及我们后续的波形图绘制。这里简单介绍下,Web Audio Api是一组非常强大的Api,它提供了在Web中控制音频、处理音频的一整套有效通用的系统。它能够允许开发着,控制音频,自选音频源、对音频添加特效,使音频可视化,添加空间效果,添加混响等等。而我们今天要实现的功能,仅仅只用到了其中几个Api,整体流程如下:

Web Audi怎么绘制音频图谱

// audio 初始化function initAudio (data) {  // 音频数据解码  // decodeAudioData方法接收一个arrayBuffer数据作为参数,这也是为什么前面fetch音频时设置以arrayBuffer格式接收数据  audioCtx.decodeAudioData(data).then(buffer => {    // decodeAudioData解码完成后,返回一个AudioBuffer对象    // 绘制音频波形图    drawWave(buffer);    // 连接音频源    source.buffer = buffer;    source.connect(audioCtx.destination);    // 音频数据处理完毕    alert('音频数据处理完毕!');  });}// web audio 规范不允许音频自动播放,需要用户触发页面事件来触发播放,这里我们增加一个播放按钮,数据处理完毕后点击播放document.querySelector('#btn').onclick = () => {  // 播放音频  source.start(0);}

通过解码后的音频数据,绘制波形图

音频数据通过AudioContext解码后,返回一个AudioBuffer对象,这个对象,保存有音频的采样率、声道、pcm数据等信息。通过getChannelData方法可以获取到音频某个声道的pcm数据。返回的是一个Float32Array对象,数值范围在-1到1之间。音频数据比较庞大,每一秒钟可能包含成千上万的数据,因此我们在做图形绘制时,需要对数据进一步采样。比如,这里我们采用每1000条数据中,取一个最大值(正数)一个最小值(负数)来绘制图形;

// 绘制波形图function drawWave (buffer) {  // buffer.numberOfChannels返回音频的通道数量,1即为单声道,2代表双声道。这里我们只取一条通道的数据  let data = [];  let originData = buffer.getChannelData(0);  // 存储所有的正数据  let positives = [];  // 存储所有的负数据  let negatives = [];  // 先每隔100条数据取1条  for (let i = 0; i < originData.length; i += 100) {    data.push(originData[i]);  }  // 再从data中每10条取一个最大值一个最小值  for (let j = 0, len = parseInt(data.length / 10); j < len; j++) {    let temp = data.slice(j * 10, (j + 1) * 10);    positives.push(Math.max.apply(null, temp));    negatives.push(Math.min.apply(null, temp));  }  // 创建canvas上下文  let canvas = document.querySelector('#canvas');  if (canvas.getContext) {    let ctx = canvas.getContext('2d');    canvas.width = positives.length;    let x = 0;    let y = 100;    let offset = 0;    ctx.fillStyle = '#fa541c';    ctx.beginPath();    ctx.moveTo(x, y);    // canvas高度200,横坐标在canvas中点100px的位置,横坐标上方绘制正数据,下方绘制负数据    // 先从左往右绘制正数据    // x + 0.5是为了解决canvas 1像素线条模糊的问题    for (let k = 0; k < positives.length; k++) {      ctx.lineTo(x + k + 0.5, y - (100 * positives[k]));    }    // 再从右往左绘制负数据    for (let l = negatives.length - 1; l >= 0; l--) {      ctx.lineTo(x + l + 0.5, y + (100 * Math.abs(negatives[l])));    }    // 填充图形    ctx.fill();  }};

读到这里,这篇“Web Audi怎么绘制音频图谱”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Web Audi怎么绘制音频图谱

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Web Audi怎么绘制音频图谱

本文小编为大家详细介绍“Web Audi怎么绘制音频图谱”,内容详细,步骤清晰,细节处理妥当,希望这篇“Web Audi怎么绘制音频图谱”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。实现思路先介绍下小编的整体思路
2023-07-05

python如何绘制音频的语谱图

这篇文章主要介绍python如何绘制音频的语谱图,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!本文介绍如何通过python的pyplot来绘制音频的语谱图。语谱图,也就是语音频谱图,也叫时频图,横坐标是时间,纵坐标是
2023-06-19

一文详解WebAudi绘制音频图谱

这篇文章主要为大家介绍了WebAudi绘制音频图谱实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-09

怎么在Matlab中利用fft绘制信号频谱图

这篇文章将为大家详细讲解有关怎么在Matlab中利用fft绘制信号频谱图,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。fs=500;%采样率f1=5;%信号频率f2=10;%信号频率T=1;
2023-06-14

word怎么绘制家谱图结构图

要绘制家谱图或者结构图,可以使用word中的形状和线条工具来绘制。以下是一种绘制家谱图的方法:1. 打开Word文档,选择“插入”选项卡,然后选择“形状”下的“矩形”工具。2. 在文档中点击鼠标左键并拖动,绘制一个矩形框,表示家族的起始人或
2023-09-16

怎么在Java中使用字节流实现图片音频的复制

怎么在Java中使用字节流实现图片音频的复制?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java字节流复制图片音频java中的字节流可以实现文本的读入写入,当然也可以实现
2023-06-15

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录