vue3项目已知接口地址http://192.168.0.14:8099/busFireExtinguisher/test返回了一个音频流,如何将接口返回的音频流生成波形图
时间: 2024-09-13 16:18:36 浏览: 44
VUE--组件示例 博客 https://gudianxiaoshuo.blog.csdn.net/article/detail
要将接口返回的音频流生成波形图,可以使用Web Audio API来处理音频数据,并使用HTML的`<canvas>`元素来绘制波形。以下是一个基本的步骤概述,用于在Vue3项目中实现这个功能:
1. 创建一个音频上下文(`AudioContext`)。
2. 使用`fetch`或`axios`来获取音频流数据。
3. 将获取的音频流解码为音频片段(`AudioBuffer`)。
4. 创建一个音频节点,将音频片段加载到源节点(`AudioBufferSourceNode`)。
5. 创建一个分析器节点(`AnalyserNode`),用于获取音频数据。
6. 将源节点和分析器节点连接到目标节点(如`AudioContext.destination`)。
7. 使用`requestAnimationFrame`循环获取音频数据并绘制波形。
8. 在`<canvas>`元素上绘制波形图。
下面是一个简化的代码示例:
```javascript
<template>
<div>
<canvas ref="waveformCanvas" width="1024" height="256"></canvas>
</div>
</template>
<script setup>
import { ref, onMounted, onBeforeUnmount } from 'vue';
const waveformCanvas = ref(null);
const ctx = ref(null);
onMounted(async () => {
const audioContext = new (window.AudioContext || window.webkitAudioContext)();
ctx.value = waveformCanvas.value.getContext('2d');
// 获取音频流并解码
const response = await fetch('http://192.168.0.14:8099/busFireExtinguisher/test');
const arrayBuffer = await response.arrayBuffer();
const audioBuffer = await audioContext.decodeAudioData(arrayBuffer);
// 创建源节点和分析器节点
const source = audioContext.createBufferSource();
const analyser = audioContext.createAnalyser();
source.buffer = audioBuffer;
source.connect(analyser);
analyser.connect(audioContext.destination);
// 配置分析器
analyser.fftSize = 1024;
const bufferLength = analyser.frequencyBinCount;
const dataArray = new Uint8Array(bufferLength);
// 开始播放音频
source.start(0);
source.loop = true;
// 绘制波形
const drawWaveform = () => {
requestAnimationFrame(drawWaveform);
// 获取当前帧的音频数据
analyser.getByteFrequencyData(dataArray);
ctx.value.clearRect(0, 0, waveformCanvas.value.width, waveformCanvas.value.height);
// 绘制波形
ctx.value.fillStyle = 'rgb(0, 0, 0)';
ctx.value.fillRect(0, 0, waveformCanvas.value.width, waveformCanvas.value.height);
// 计算波形的高度并绘制
const barWidth = (waveformCanvas.value.width / bufferLength) * 2.5;
let barHeight;
let x = 0;
for(let i = 0; i < bufferLength; i++) {
barHeight = dataArray[i];
ctx.value.fillStyle = 'rgb(' + (barHeight+100) + ',50,50)';
ctx.value.fillRect(x, waveformCanvas.value.height - barHeight / 2, barWidth, barHeight / 2);
x += barWidth + 1;
}
};
drawWaveform();
});
onBeforeUnmount(() => {
// 清除定时器,避免内存泄漏
cancelAnimationFrame();
});
</script>
```
请注意,这段代码是一个简化的示例,实际应用中可能需要根据实际音频流的特性进行调整。此外,由于音频流可能是实时数据,因此可能需要使用WebSocket或其他实时数据传输协议来处理流媒体。
阅读全文