当前位置:首页 > 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支持多种消息推送方式,包括uniPush、个推、极光推送等。以下为常见实现方案: uniPush(官方推荐) uniapp官方提供的推送服务,基于DClou…

uniapp关闭侧滑

uniapp关闭侧滑

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

丸子uniapp

丸子uniapp

丸子UniApp简介 丸子UniApp是一个基于UniApp框架开发的移动应用解决方案,通常用于快速构建跨平台应用(如微信小程序、H5、Android/iOS等)。其核心特点是利用UniApp的“一次…

uniapp图文

uniapp图文

图文混排实现方式 在uniapp中实现图文混排通常采用<rich-text>组件或自定义样式布局。<rich-text>支持解析HTML字符串,适合动态内容渲染。 <te…

uniapp工程

uniapp工程

uniapp工程简介 uniapp是一个基于Vue.js的跨平台开发框架,允许开发者使用一套代码同时生成iOS、Android、H5以及小程序应用。它通过条件编译和平台特性适配,实现多端兼容。 创建…

uniapp grid

uniapp grid

uniapp grid 布局实现方法 在 uniapp 中实现 grid 布局可以通过多种方式完成,包括使用内置组件、CSS Grid 或第三方插件。以下是几种常见的实现方法: 使用 uni-gri…