当前位置: 首页 > news >正文

根据音频绘制频谱

根据音频链接绘制频谱图

封装

// 可以这样使用 也可以 import { AudioContext } from 'standardized-audio-context';
const getAudioContext = window.AudioContext ||window.webkitAudioContext ||window.mozAudioContext ||window.msAudioContext;const clearArr = []export const stopAudio = () => { clearArr.forEach(f => f()) }/*** 获取音频文件频谱数据 */
export function getAuidoData() {let analyser, dataArray;let loadOver = false;var audioCtx = new getAudioContext({latencyHint: "playback"}); // 创建和播放需要间隔一端时间analyser = audioCtx.createAnalyser();analyser.fftSize = 2048;const destroy = () => { audioCtx.close() }let stop = false;const cbs = []const run = () => {if (stop) return;requestAnimationFrame(() => {var bufferLength = analyser.frequencyBinCount;dataArray = new Uint8Array(bufferLength);analyser.getByteFrequencyData(dataArray);cbs.forEach(f => f(dataArray))run()});};const load = (url, data, onended = () => { }) => {let audioBuffer;// 通过fetch 请求音频获取 arrayBuffer 类型数据const getData = () => { // 方法一 使用fetch请求return fetch(url).then((res) => res.arrayBuffer()).then((arrayBuffer) => {return new Promise((resolve, reject) => {// 兼容低版本的iphone7中 audioCtx.decodeAudioData 返回的不是一个promise,必须通过回调函数audioCtx.decodeAudioData(arrayBuffer, resolve, err => {console.log('decodeAudioData-er', err);reject(err)})})}).then((buffer) => (audioBuffer = buffer));// 方法二 把接口返回blob转 arrayBuffer // ios ajax返回的二进制数据没有 arrayBuffer 方法// return data//     .arrayBuffer()//     .then((arrayBuffer) => audioCtx.decodeAudioData(arrayBuffer))//     .then((buffer) => (audioBuffer = buffer));};getData().then(function () {// 创建音频源const source = audioCtx.createBufferSource();source.buffer = audioBuffer;source.connect(analyser);analyser.connect(audioCtx.destination);// 创建音量节点// const gainNode = audioCtx.createGain();// gainNode.gain.value = 1 // 设置声音大小console.log('source.start');source.start(); // 开始播放run();source.onended = () => {console.log('source.onended'); onended()stop = true}; // 播放完成loadOver = true;clearArr.push(() => { source.stop() })}).catch(err => {console.log('getdata-err', err);});};const change = (cb = () => { }) => cbs.push(cb)return { load, change, destroy };
}

方式 1,直接传递二进制音频数据

// 获取二进制数据// data:二进制音频数据
const blobData = new Blob([data], { type: "audio/mpeg" });
const url = window.URL.createObjectURL(blobData);
const upWave = getAuidoData();
upWave.change((data) => {// draw({data}) // 绘制
});
await new Promise((c) => upWave.load(url, "", c));

方式 2 使用音频链接

const upWave = getAuidoData();
upWave.change((data) => {// draw({data}) // 绘制
});
await new Promise((c) => upWave.load("xxx.mp3", "", c));

注意:在有些设备(iphone7)上,录音和播放不能同时进行, 在一些iphone上 同时进行回导致 播放声音音量较小
注意:在有些设备上,

绘制实现

绘制实现

http://www.lryc.cn/news/236611.html

相关文章:

  • SSL证书对网站SEO的好处
  • YB506AB是一款理电池充、放电管理专用芯片,集成锂电池充电管理和降压DC-DC电路。
  • Linux | C语言中volatile关键字的理解
  • 汇编层面有三个主要的操作对象
  • React中的Redux:简介和实例代码
  • Modbus转Profinet网关在金银精炼控制系统中应用案例
  • 小程序商城免费搭建之java商城 电子商务Spring Cloud+Spring Boot+二次开发+mybatis+MQ+VR全景+b2b2c
  • Rabin加解密算法(python3)
  • 【带头学C++】----- 七、链表 ---- 7.5 学生管理系统(链表--上)
  • (四)什么是Vite——冷启动时vite做了什么(源码、middlewares)
  • Docker部署MinIO对象存储服务器结合Cpolar实现远程访问
  • C#入门(1):程序结构、数据类型
  • Scala---元组
  • 【Linux】冯诺依曼体系结构、操作系统、进程概念、进程状态、环境变量、进程地址空间
  • 【hive-解决】HiveAccessControlException Permission denied: CREATEFUNCTION
  • 内网穿透的应用-通过内网穿透快速搭建公网可访问的Spring Boot接口调试环境
  • 解决 uniapp 开发微信小程序 不能使用本地图片作为背景图 问题
  • 常用中间件封装思路粗记
  • 探索SPI:深入理解原理、源码与应用场景
  • Web3名词解释
  • Vatee万腾外汇市场新力量:vatee科技决策力
  • 【HarmonyOS开发】配置开发工具DevEco Studio
  • 探索亚马逊大语言模型:开启人工智能时代的语言创作新篇章
  • zabbix-proxy分布式监控
  • springboot生成PDF,并且添加水印
  • Tensorflow2.0:CNN、ResNet实现MNIST分类识别
  • 本地jar导入maven
  • 数据结构与算法【堆】的Java实现
  • 同创永益联合红帽打造一站式数字韧性解决方案
  • c++ call_once 使用详解