根据音频绘制频谱

根据音频链接绘制频谱图

封装

js 复制代码
// 可以这样使用 也可以 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,直接传递二进制音频数据

js 复制代码
// 获取二进制数据

// 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 使用音频链接

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

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

注意:在有些设备上,

绘制实现

绘制实现

相关推荐
音视频牛哥41 分钟前
基于 SmartMediaKit 的座舱远程遥控系统技术方案——面向多摄像头、多角度、低延迟传输控制与内网/5G广域网融合场景
音视频·低延迟rtsp播放器·低延迟视频传输·座舱远程遥控·5g远程控制·远程驾驶系统·低延迟rtmp播放
EasyGBS2 小时前
从“后厨黑箱”到“透明厨房”:国标GB28181视频平台EasyGBS平台AI视频分析如何守护舌尖上的安全
人工智能·安全·音视频
昨日之日20062 小时前
LongCat-Video-Avatar-1.5 - 一句话生成口型同步、动作稳定的数字人 说话/唱歌 视频 一键整合包下载
音视频
searchforAI3 小时前
长视频和播客怎么变成结构化读书笔记?一套 AI 时代的知识管理方法
人工智能·笔记·gpt·音视频·语音识别
不想吃饭e4 小时前
uniapp-图片,视频上传组件封装
java·uni-app·音视频
做萤石二次开发的哈哈4 小时前
具备 ERTC 能力的萤石设备如何对接客户端通话?
音视频·实时音视频·萤石开放平台
电子元件小说家4 小时前
音频调音台直滑电位器选型:ALPS RK12L123000E 与国产同于科技替代方案评估
科技·音视频
人工智能研究所5 小时前
字节开源 OmniShow:文本,图片,音频,人体姿态多输入,一键成片
人工智能·神经网络·开源·音视频·开源软件·字节跳动·ai 视频
byte轻骑兵7 小时前
【LE Audio】CAP精讲[14]: BR/EDR传输连接实战,老设备兼容的核心流程解析
网络·音视频·le audio·音视频控制·车机蓝牙
jbk33117 小时前
谷哥找同片助手:相同视频片段自动寻找匹配功能使用说明
人工智能·音视频·剪辑软件·剪映自动化软件