当前位置:首页 > uni-app

uniapp录音转波形

2026-02-06 11:18:11uni-app

uniapp 录音转波形实现方法

使用 uni.getRecorderManager 录音

在 uniapp 中通过 uni.getRecorderManager API 获取录音管理器实例,配置录音参数并开始录音。录音完成后获取临时文件路径。

const recorderManager = uni.getRecorderManager();
recorderManager.start({
  format: 'mp3',
  sampleRate: 44100,
  numberOfChannels: 1
});

recorderManager.onStop((res) => {
  const tempFilePath = res.tempFilePath;
  // 处理录音文件
});

通过 Web Audio API 解析音频数据

将录音文件转换为 ArrayBuffer,使用 Web Audio API 解码音频数据并获取波形数据。需注意浏览器兼容性。

const audioContext = new (window.AudioContext || window.webkitAudioContext)();
const fileReader = new FileReader();

fileReader.onload = function(e) {
  audioContext.decodeAudioData(e.target.result).then((buffer) => {
    const channelData = buffer.getChannelData(0);
    // 提取波形数据
  });
};
fileReader.readAsArrayBuffer(tempFile);

使用 Canvas 绘制波形图

获取音频数据后,通过 Canvas 绘制波形可视化效果。可根据采样率对数据进行降采样处理以提高性能。

uniapp录音转波形

const canvas = document.getElementById('waveform');
const ctx = canvas.getContext('2d');
const step = Math.ceil(channelData.length / canvas.width);

ctx.clearRect(0, 0, canvas.width, canvas.height);
for (let i = 0; i < canvas.width; i++) {
  const min = 1.0;
  const max = -1.0;
  for (let j = 0; j < step; j++) {
    const datum = channelData[(i * step) + j];
    min = Math.min(min, datum);
    max = Math.max(max, datum);
  }
  ctx.fillRect(i, (1 + min) * canvas.height / 2, 1, Math.max(1, (max - min) * canvas.height / 2));
}

使用第三方库简化实现

考虑使用现成的音频处理库如 wavesurfer.js 简化开发流程。需在 uni-app 项目中引入对应库。

import WaveSurfer from 'wavesurfer.js';

const wavesurfer = WaveSurfer.create({
  container: '#waveform',
  waveColor: 'violet',
  progressColor: 'purple'
});
wavesurfer.load(tempFilePath);

注意事项

  • 真机调试时需要确认录音权限已获取
  • iOS 平台对自动播放有限制,需要用户交互触发
  • 大音频文件处理可能导致性能问题,建议分片处理
  • 微信小程序环境与 H5 环境的 API 存在差异需做兼容处理

扩展功能实现

实时波形显示

通过 RecorderManager 的 onFrameRecorded 事件实现实时波形更新,需要注意性能优化。

uniapp录音转波形

recorderManager.onFrameRecorded((res) => {
  const { frameBuffer } = res;
  // 处理实时帧数据更新UI
});

波形交互功能

为 Canvas 添加事件监听实现点击跳转、区域选择等交互功能,提升用户体验。

canvas.addEventListener('click', (e) => {
  const percent = e.offsetX / canvas.width;
  // 跳转到对应音频位置
});

多平台兼容方案

针对不同平台使用条件编译实现差异化处理,保证各端功能正常。

// #ifdef H5
// Web Audio API 实现
// #endif

// #ifdef MP-WEIXIN
// 小程序专用API
// #endif

标签: 波形uniapp
分享给朋友:

相关文章

uniapp 极光推送

uniapp 极光推送

uniapp 集成极光推送的方法 在 uniapp 中集成极光推送,需要使用官方提供的插件或自行封装原生模块。以下是具体实现方式: 使用官方插件 在 uni-app 插件市场搜索「极光推送」插件,…

uniapp分享到facebook

uniapp分享到facebook

使用uniapp分享到Facebook的方法 在uniapp中实现分享到Facebook功能,可以通过调用原生插件或使用第三方SDK。以下是具体实现方式: 安装Facebook SDK插件 在uni…

uniapp关闭侧滑

uniapp关闭侧滑

禁用全局侧滑返回功能 在pages.json中配置全局禁止侧滑返回: { "globalStyle": { "popGesture": "none" } } 禁用单个页面侧滑返回 在…

uniapp改变checkbox选中状态

uniapp改变checkbox选中状态

修改 checkbox 选中状态的方法 在 uniapp 中修改 checkbox 的选中状态可以通过以下几种方式实现: 绑定 v-model 控制状态 通过数据绑定方式控制 checkbox 的…

uniapp gpio

uniapp gpio

在 uniapp 中直接操作 GPIO(通用输入输出)通常需要依赖原生平台的硬件接口,因为 uniapp 本身是基于前端技术的跨平台框架,不直接提供硬件访问能力。以下是实现 GPIO 控制的几种方法:…

uniapp 线程

uniapp 线程

uniapp 线程的概念 在 uniapp 中,线程的概念与原生应用开发有所不同。由于 uniapp 是基于 JavaScript 的运行环境,它并不直接支持多线程操作。JavaScript 本身是单…