iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >前端音频可视化Web Audio如何实现
  • 817
分享到

前端音频可视化Web Audio如何实现

2023-07-05 10:07:07 817人浏览 泡泡鱼
摘要

这篇文章主要介绍“前端音频可视化WEB Audio如何实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“前端音频可视化Web Audio如何实现”文章能帮助大家解决问题。实现思路

这篇文章主要介绍“前端音频可视化WEB Audio如何实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“前端音频可视化Web Audio如何实现”文章能帮助大家解决问题。

实现思路

首先画肯定是用canvas去画,关于音频的相关数据(如频率、波形)如何去获取,需要去获取相关audio的DOM 或通过请求处理去拿到相关的音频数据,然后通过Web Audio api 提供相关的方法来实现。(当然还要考虑要音频请求跨域的问题,留在最后。)

一个简单而典型的 web audio 流程如下(取自MDN):

  • 创建音频上下文

  • 在音频上下文里创建源 &mdash; 例如 <audio>, 振荡器,流

  • 创建效果节点,例如混响、双二阶滤波器、平移、压缩

  • 为音频选择一个目的地,例如你的系统扬声器

连接源到效果器,对目的地进行效果输出

前端音频可视化Web Audio如何实现

实现

一、频率图

实现第一种类型,首先我们需要通过fetch或xhr来获取一个线上音频的数据,这里以fetch为例;

 //创建一个音频上下文、考虑兼容性问题 let audioctx = new (window.AudioContext || window.webkitAudioContext)(); //添加一个音频源节点 let source = audioCtx.createBufferSource();//res.arrayBuffer是将数据转换为arrayBuffer格式 fetch(url).then((res) => res.arrayBuffer()).then((res) => {        //decodeAudioData是将arrayBuffer格式数据转换为audioBuffer        audioCtx.decodeAudioData(res).then((buffer) => {          // decodeAudioData解码完成后,返回一个AudioBuffer对象          // 绘制音频波形图          draw(buffer);          // 连接音频源          source.buffer = buffer;          source.connect(audioCtx.destination);          // 音频数据处理完毕        });      });

前端音频可视化Web Audio如何实现

需要明白的是,source.connect(audioCtx.destination)是将音频源节点链接到输出设备,否则会没声音哦。那么现在有了数据、我们只需要通过canvas将数据画出来即可。

function draw(buffer) {  // buffer.numberOfChannels返回音频的通道数量,1即为单声道,2代表双声道。这里我们只取一条通道的数据  let data = [];  let originData = buffer.getChannelData(0);  // 存储所有的正数据  let positives = [];  // 存储所有的负数据  let negatives = [];  // 先每隔50条数据取1条  for (let i = 0; i < originData.length; i += 50) {    data.push(originData[i]);  }  // 再从data中每10条取一个最大值一个最小值  for (let j = 0, len = data.length / 10; j < len; j++) {    let temp = data.slice(j * 10, (j + 1) * 10);    positives.push(Math.max(...temp));    negatives.push(Math.min(...temp));  }  if (canvas.getContext) {    let ctx = canvas.getContext("2d");    canvas.width = positives.length;    let x = 0;    let y = 75;    let offset = 0;    var grd = ctx.createLinearGradient(0, 0, canvas.width, 0);    // 为渐变添加颜色,参数1表示渐变开始和结束之间的位置(用0至1的占比表示),参数2位颜色    grd.addColorStop(0, "yellow");    grd.addColorStop(0.5, "red");    grd.addColorStop(1, "blue");    ctx.fillStyle = grd;    ctx.beginPath();    ctx.moveTo(x, y);    // 横坐标上方绘制正数据,下方绘制负数据    // 先从左往右绘制正数据    // x + 0.5是为了解决canvas 1像素线条模糊的问题    for (let k = 0; k < positives.length; k++) {      ctx.lineTo(x + k + 0.5, y - 50 * positives[k]);    }    // 再从右往左绘制负数据    for (let l = negatives.length - 1; l >= 0; l--) {      ctx.lineTo(x + l + 0.5, y + 50 * Math.abs(negatives[l]));    }    // 填充图形    ctx.fill();  }}

[参考文章](Web Audio - 绘制音频图谱 

二、实时频率图

实现第二种类型,获取实时频率,用到的API与第一种有区别,但流程一直,都是通过一个音频源节点通过连接达到效果。只不过在连接的中间加入了一个分析器analyser,在将分析器连接到输出设备。

    const audio =document.querySelector('audio')    //解决音频跨域问题    audio.crossOrigin ='anonymous'    const  canvas =document.querySelector('canvas')    const ctx=canvas.getContext("2d")        function initCanvas(){        //初始化canvas            canvas.width=window.innerWidth*devicePixelRatio            canvas.height=(window.innerHeight/2)*devicePixelRatio        }        initCanvas()        //将数据提出来        let dataArray,analyser;        //播放事件        audio.onplay=function(){            //创建一个音频上下文实例            const audioCtx=new (window.AudioContext || window.webkitAudioContext)();            //添加一个音频源节点            const source=audioCtx.createMediaElementSource(audio);            //分析器节点             analyser=audioCtx.createAnalyser();            //fft分析器  越大 分析越细            analyser.fftSize=512            //创建一个无符号字节的数组             dataArray=new Uint8Array( analyser.frequencyBinCount);            //音频源节点 链接分析器            source.connect(analyser)            //分析器链接输出设备            analyser.connect(audioCtx.destination,)        }

那么接下来至于怎么把数据画出来,就凭大家的想法了。

            requestAnimationFrame(draw)            //            const {width ,height}=canvas;            ctx.clearRect(0,0,width,height)            //分析器节点分析出的数据到数组中            ctx.fillStyle='#78C5F7'           ctx.lineWidth = 2;            ctx.beginPath();            //getByteFrequencyData,分析当前音频源的数据 装到dataArray数组中去            //获取实时数据            analyser.getByteFrequencyData(dataArray)            // console.log(dataArray);            const len =dataArray.length;            const barWidth=width/len;            let x=0;            for(let i=0;i<len;i++){                const data=dataArray[i];                const barHeight=data/255*height;                // ctx.fillRect(x,y,barWidth,height)        let v = dataArray[i] / 128.0;        let y = v * height/2;        if(i === 0) {            ctx.moveTo(x, y);        } else {            ctx.lineTo(x, y);        }        x += barWidth;            }            // ctx.lineTo(canvas.width, canvas.height/2);            ctx.stroke();        }        draw();

关于请求音频跨域问题解决方案

给获取的audio DOM添加一条属性即可

   audio.crossOrigin ='anonymous'

或者直接在 aduio标签中 加入 crossorigin="anonymous"

关于“前端音频可视化Web Audio如何实现”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: 前端音频可视化Web Audio如何实现

本文链接: https://www.lsjlt.com/news/351204.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 前端音频可视化Web Audio如何实现
    这篇文章主要介绍“前端音频可视化Web Audio如何实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“前端音频可视化Web Audio如何实现”文章能帮助大家解决问题。实现思路...
    99+
    2023-07-05
  • 前端音频可视化Web Audio实现示例详解
    目录背景实现思路实现一、频率图二、实时频率图关于请求音频跨域问题解决方案总结背景 最近听音乐的时候,看到各种动效,突然好奇这些音频数据是如何获取并展示出来的,于是花了几天功夫去研究...
    99+
    2023-03-09
    Web Audio音频可视化 Web Audio
  • C#如何使用NAudio实现音频可视化
    小编给大家分享一下C#如何使用NAudio实现音频可视化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!预览:捕捉声卡输出:实现音频可视化, 第一步就是获得音频采样...
    99+
    2023-06-15
  • html5如何实现开始播放当前的音频或视频
    这篇文章将为大家详细讲解有关html5如何实现开始播放当前的音频或视频,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。实例带有播放和暂停按钮的一段视频:var m...
    99+
    2024-04-02
  • C#使用 NAudio 实现音频可视化的方法
    预览: 捕捉声卡输出: 实现音频可视化, 第一步就是获得音频采样, 这里我们选择使用计算机正在播放的音频作为采样源进行处理: NAudio 中, 可以借助 WasapiLoopba...
    99+
    2024-04-02
  • 在Html中如何实现音、视频
    这篇文章将为大家详细讲解有关在Html中如何实现音、视频,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 在Html中也是可以播放音频和视频的,不过这项功能添加在了Htm...
    99+
    2024-04-02
  • JS如使用音频可视化插件Wavesurfer.js
    这篇文章主要为大家展示了“JS如使用音频可视化插件Wavesurfer.js”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JS如使用音频可视化插件Wavesur...
    99+
    2024-04-02
  • Qt音视频开发之音频播放QAudioOutput如何实现
    这篇文章主要介绍了Qt音视频开发之音频播放QAudioOutput如何实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Qt音视频开发之音频播放QAudioOutput如何实现文章都会有所收获,下面我们一起来看...
    99+
    2023-07-05
  • Android 音频可视化:频谱特效的探索与实践
    音频可视化,一言以蔽之,就是声音到图像的转换。 随着视觉工业时代的到来,用户逐渐重视产品的极致体验,在市场上诸多优秀的音乐类APP中,频谱动效 是一个经典的应用场景: 图片来源:咪咕音乐 本文...
    99+
    2023-09-16
    android 音视频
  • Web Audio浏览器采集麦克风音频数据怎么实现
    今天小编给大家分享一下Web Audio浏览器采集麦克风音频数据怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下...
    99+
    2023-07-05
  • Golang如何实现RTP音视频传输
    今天小编给大家分享一下Golang如何实现RTP音视频传输的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。引言在 Coding...
    99+
    2023-07-02
  • Python如何实现视频中添加音频工具
    这篇文章主要介绍Python如何实现视频中添加音频工具,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!环境依赖ffmpeg环境安装,可以参考:windows ffmpeg安装部署ffmpy安装:pip ins...
    99+
    2023-06-21
  • 如何在PHP中实现音视频会议
    在当今繁忙的社交和商业环境中,音视频会议已成为人们与客户或同事交流的必要方式。PHP是一种广泛使用的编程语言,其中实现音视频会议是可能的。在本文中,我们将讨论如何在PHP中实现音视频会议。选择一个合适的WebRTC框架WebRTC是一种用于...
    99+
    2023-05-22
    PHP 音视频 会议
  • WebRTC音视频通话-实现iOS端调用ossrs视频通话服务
    WebRTC音视频通话-实现iOS端调用ossrs视频通话服务 之前搭建ossrs服务,可以查看:https://blog.csdn.net/gloryFlow/article/details/132...
    99+
    2023-09-04
    webrtc 音视频 ios WebRTC 视频通话 ossrs
  • 前端可视化搭建定义联动协议实现
    目录引言设计联动协议实现联动协议总结引言 虽然底层框架提供了通用的组件值与联动配置,可以建立对组件任意 props 的映射,但这只是一个能力,还不是协议。 业务层是可以确定一个协议的...
    99+
    2023-05-19
    前端可视化搭建联动协议 前端可视化搭建
  • Python自动化实现抖音自动刷视频
    目录环境准备实现环境准备 Python3.5以上Appium Server服务器Android SDK,需要用到adb服务需要依赖Appium-Python-Client组件库真机或...
    99+
    2023-03-19
    Python 抖音自动刷视频 Python 抖音自动
  • C++ Qt如何实现音视频播放功能
    这篇文章将为大家详细讲解有关C++ Qt如何实现音视频播放功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。由于最近着手的Qt项目需要视频播放 自己做的时候踩了很多坑&n...
    99+
    2023-06-21
  • SpringBoot Admin 如何实现Actuator端点可视化监控
    目录SpringBoot Admin 实现Actuator端点可视化监控简介Spring Boot Admin ServerSpring Boot Admin Client启动客户端...
    99+
    2024-04-02
  • Qt+Quick如何实现播放音乐和视频
    这篇文章主要介绍了Qt+Quick如何实现播放音乐和视频的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Qt+Quick如何实现播放音乐和视频文章都会有所收获,下面我们一起来看看吧。MediaPlayer 是 Q...
    99+
    2023-07-05
  • 如何解决移动端HTML5音频与视频的问题
    小编给大家分享一下如何解决移动端HTML5音频与视频的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!最近在研究用视频代替动画,用视频代替精灵动画,我们称这种视...
    99+
    2023-06-09
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作