更新记录

2.0.2(2026-06-21) 下载此版本

v2.0.2 (2026-06-21)

2.0.1(2026-06-20) 下载此版本

v2.0.1 (2026-06-20)

2.0.0(2026-06-19) 下载此版本

v2.0.0 (2026-06-19)

查看更多

平台兼容性

uni-app(4.65)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
- × × × ×
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
× × × × × × × × × × × ×

jz-h5RecorderManager H5 录音插件

版本:v2.0.1 日期:2026-06-20
适用平台:H5

插件简介

这是一个完全兼容 uni.getRecorderManager API 的 H5 专用录音插件。v2.0.0 版本全面重构,聚焦 H5 平台,提供两大录音方案:

方案 入口 适用场景
PCM 切片方案 getRecorderManager() 录音文件生成、语音识别、波形可视化、WebSocket 实时传输
MediaStream 方案 getStreamRecorderManager() 实时语音通话、会议、WebRTC 推流/订阅

v3.0.0 核心特性

功能 说明 适用场景
onFrameRecorded 实时音频切片(Int16 PCM) 语音识别、波形可视化、文件分片上传
onLiveFrameRecorded WebRTC 实时切片(Float32 PCM) 实时语音通话、WebSocket 实时传输
MediaStream 方案 获取音频流,浏览器自动降噪 实时通话、WebRTC 推流
StreamPublisher WebRTC 音频推流 向远端推送本地音频流
StreamSubscriber WebRTC 音频订阅 接收远端音频流并播放
StreamVolumeMeter 音量监听器 实时音量检测与可视化
LiveFramePlayer 实时帧播放器 播放 Float32 PCM 实时帧
RecorderConvert 音频格式转换 PCM→MP3、ArrayBuffer↔Base64 等

特性

  • ✅ 完全兼容 uni.getRecorderManager API
  • 仅支持 H5 平台,专注 Web Audio API 能力
  • ✅ 实时切片功能(onFrameRecorded,Int16 PCM)
  • ✅ WebRTC 实时切片(onLiveFrameRecorded,Float32 PCM)
  • ✅ MediaStream 流式采集,浏览器自动降噪回声消除
  • ✅ WebRTC 推流/订阅(StreamPublisher / StreamSubscriber)
  • ✅ 实时帧播放器(LiveFramePlayer,精确调度无间隙播放)
  • ✅ 音量监听器(StreamVolumeMeter)
  • ✅ 音频格式转换(PCM→MP3、ArrayBuffer↔Base64 等)
  • ✅ 多种音频约束预设(默认/高质量/低延迟/会议)
  • ✅ 支持录音暂停/继续功能
  • ✅ 支持录音时长限制
  • ✅ 完善的错误处理机制
  • ✅ 自动权限检测和申请
  • ✅ 类继承架构,易于扩展维护

安装使用

1. 引入插件

// 方式一:默认导入
import jzRecorder from '@/uni_modules/jz-h5RecorderManager/js/index.js'

// 方式二:按需导入
import { getRecorderManager } from '@/uni_modules/jz-h5RecorderManager/js/index.js'

// 方式三:导入 WebRTC 模块
import { StreamPublisher, StreamSubscriber } from '@/uni_modules/jz-h5RecorderManager/js/webrtc/'

2. PCM 切片方案 — 基本录音

const recorderManager = jzRecorder.getRecorderManager()

// 开始录音
recorderManager.start({
  duration: 60000,       // 最大录音时长 60秒
  sampleRate: 44100,     // 采样率
  numberOfChannels: 1,   // 单声道
  encodeBitRate: 192000, // 编码码率
  format: 'webm',        // 输出格式
  frameSize: 5           // 切片大小 5KB
})

// 监听录音停止
recorderManager.onStop((res) => {
  console.log('录音时长:', res.duration)
  console.log('MIME 类型:', res.mimeType)
  console.log('ArrayBuffer:', res.arrayBuffer)
  console.log('PCM 数据:', res.pcmArrayBuffer)
  console.log('PCM 采样率:', res.pcmSampleRate)
})

// 监听录音切片
recorderManager.onFrameRecorded((res) => {
  console.log('收到切片:', res.frameBuffer.byteLength, '字节')
  // 发送到 WebSocket 进行语音识别
})

3. PCM 切片方案 — WebRTC 实时切片

const recorderManager = jzRecorder.getRecorderManager()

// 启用实时切片
recorderManager.start({
  sampleRate: 44100,
  format: 'webm',
  enableLiveFrame: true,  // 启用 WebRTC 实时切片
  frameSize: 2            // 小切片,低延迟
})

// 监听实时切片并发送
recorderManager.onLiveFrameRecorded((res) => {
  // 实时发送到 WebSocket
  ws.send(res.liveFrameBuffer)
})

4. MediaStream 方案 — 音频流采集

const streamManager = jzRecorder.getStreamRecorderManager()

// 启动采集
const stream = await streamManager.start()

// 本地播放(浏览器自动降噪,无杂音)
audioElement.srcObject = stream

// 音量监听
streamManager.onVolumeChange((level) => {
  console.log('音量:', level)
})

// 静音控制
streamManager.toggleMute()

// 停止采集
streamManager.stop()

5. MediaStream 方案 — WebRTC 推流/订阅

import { StreamPublisher, StreamSubscriber } from '@/uni_modules/jz-h5RecorderManager/js/webrtc/'

// 推流:将本地音频流推送给远端
const publisher = new StreamPublisher({ peer })
publisher.setStream(localStream)
publisher.publishTo(remotePeerId)

// 订阅:接收远端音频流
const subscriber = new StreamSubscriber({
  peer,
  onStream: ({ peerId, stream }) => {
    audioElement.srcObject = stream
  }
})

6. 实时帧播放器

import { createLiveFramePlayer } from '@/uni_modules/jz-h5RecorderManager/js/index.js'

const player = createLiveFramePlayer({ latencyHint: 'interactive' })
await player.init()
player.start()

recorderManager.onLiveFrameRecorded((res) => {
  const samples = new Float32Array(res.liveFrameBuffer)
  const srcRate = recorderManager.getActualSampleRate()
  player.feed(samples, srcRate)
})

7. 音频格式转换

import { RecorderConvert } from '@/uni_modules/jz-h5RecorderManager/js/index.js'

// PCM 转 MP3
const mp3Result = await RecorderConvert.toMp3(pcmArrayBuffer, {
  sampleRate: 44100,
  channels: 1,
  bitRate: 128
})

// ArrayBuffer ↔ Base64
const base64 = await RecorderConvert.toBase64(arrayBuffer)
const ab = await RecorderConvert.toArrayBuffer(base64)

API 说明

PCM 切片方案

getRecorderManager()

获取全局唯一的录音管理器实例(单例)。

RecorderManager 对象方法

方法 说明
start(options) 开始录音
pause() 暂停录音
resume() 继续录音
stop() 停止录音
getState() 获取当前状态(idle/recording/paused)
getDuration() 获取当前录音时长(秒)
getActualSampleRate() 获取录音端实际采样率
getAudioContext() 获取内部 AudioContext

start(options) 参数

参数名 类型 必填 默认值 说明
duration Number 60000 录音时长,单位ms
sampleRate Number 44100 采样率
numberOfChannels Number 1 声道数
encodeBitRate Number 192000 编码码率
format String 'webm' 音频格式
frameSize Number 5 切片大小,单位KB
enableLiveFrame Boolean false 是否启用 WebRTC 实时切片
liveFrameSize Number 2048 实时切片帧大小(采样点数)
returnType Array ['arrayBuffer'] 返回数据类型
returnPcm Boolean true 是否返回 PCM 数据

事件监听方法

方法 回调参数 说明
onStart(callback) 录音开始
onPause(callback) 录音暂停
onResume(callback) 录音继续
onStop(callback) {mimeType, fileSize, arrayBuffer, base64, dataUrl, blobUrl, duration, pcmArrayBuffer, pcmSampleRate, ...} 录音停止
onError(callback) {errMsg} 录音错误
onFrameRecorded(callback) {frameBuffer, isLastFrame} 录音切片回调(Int16 PCM)
onLiveFrameRecorded(callback) {liveFrameBuffer, isLastFrame} WebRTC 实时切片回调(Float32 PCM)

MediaStream 方案

getStreamRecorderManager()

获取 StreamRecorderManager 实例(单例)。

createStreamRecorderManager(options)

创建新的 StreamRecorderManager 实例(非单例)。

StreamRecorderManager 对象方法

方法 说明
start(options?) 启动采集,返回 Promise\<MediaStream>
stop() 停止采集并释放流
switchDevice(deviceId) 切换输入设备
setMuted(muted) 设置静音
toggleMute() 切换静音状态
updateConstraints(constraints) 更新音频约束(需重新采集)
onVolumeChange(callback) 监听音量变化(0~1)
offVolumeChange() 移除音量监听
getStream() 获取当前 MediaStream
getTrack() 获取当前音轨
isMuted() 是否静音
isActive() 是否在采集
isSupported() 环境是否支持
dispose() 释放资源

StreamRecorderManager 事件

事件 数据 说明
start {stream, deviceId, constraints} 采集启动
stop {} 采集停止
error {errMsg, error} 采集错误
mute-change {muted} 静音状态变化

WebRTC 模块

StreamPublisher

将本地 MediaStream 推送给远端 Peer。

方法 说明
setStream(stream) 设置本地音频流
publishTo(peerId) 推送到指定 peer
publishToMany(peerIds) 批量推送
unpublish(peerId) 撤销推送
unpublishAll() 撤销所有推送
dispose() 释放资源

StreamSubscriber

接收远端 Peer 的音频流。

方法 说明
attach(peerId, stream) 注入远端流
detach(peerId) 移除订阅
detachAll() 移除所有订阅
setMuted(peerId, muted) 静音远端
setVolume(peerId, volume) 设置音量
getStream(peerId) 获取远端流
dispose() 释放资源

StreamVolumeMeter

音量监听器,支持同时监听多个流。

方法 说明
attach(key, stream, callback) 监听指定流的音量
detach(key) 移除监听
detachAll() 移除所有监听
dispose() 释放资源

音频约束预设

import {
  DEFAULT_STREAM_AUDIO_CONSTRAINTS,  // 默认(语音通话)
  HIGH_QUALITY_CONSTRAINTS,           // 高质量(音乐)
  LOW_LATENCY_CONSTRAINTS,            // 低延迟(通信)
  MEETING_CONSTRAINTS,                // 会议
  mergeConstraints,                   // 合并约束
  getConstraintsByScenario            // 按场景选择
} from '@/uni_modules/jz-h5RecorderManager/js/index.js'

LiveFramePlayer

实时 Float32 PCM 帧播放器,使用 AudioBufferSourceNode 精确调度。

import { createLiveFramePlayer } from '@/uni_modules/jz-h5RecorderManager/js/index.js'

const player = createLiveFramePlayer({
  latencyHint: 'interactive',  // AudioContext 延迟提示
  preDelay: 0.1,               // 预延迟(秒)
  maxBufferDelay: 0.5          // 最大缓冲延迟(秒)
})
方法 说明
init() 初始化播放器
start() 开始播放
stop() 停止播放
feed(samples, sourceSampleRate?) 喂入一帧 Float32 PCM 数据
flush() 清空调度队列
dispose() 释放资源
getBufferDelay() 获取当前缓冲延迟
getStats() 获取统计信息

RecorderConvert

音频格式转换工具。

方法 说明
toArrayBuffer(source) 转换为 ArrayBuffer
toBase64(source) 转换为 Base64 字符串
toDataUrl(source, mimeType?) 转换为 Data URL
toMp3(source, options?) PCM 转 MP3

目录结构

js/
├── index.js                          # 插件入口
├── core/
│   ├── RecorderManagerBase.js        # 录音管理器基类
│   ├── H5RecorderManager.js          # H5 录音实现
│   ├── RecorderManagerFacade.js      # PCM 方案 Facade(单例)
│   ├── StreamRecorderManager.js      # MediaStream 录音管理器
│   └── StreamRecorderManagerFacade.js # Stream 方案 Facade
├── common/
│   ├── EventEmitter.js               # 事件发射器
│   ├── EventBus.js                   # 事件总线
│   ├── PlatformDetector.js           # 平台检测
│   ├── AudioUtils.js                 # 音频工具函数
│   ├── LiveFramePlayer.js            # 实时帧播放器
│   ├── LameMp3Encoder.js             # MP3 编码器
│   ├── RecorderConvert.js            # 音频格式转换
│   ├── RecorderDataSource.js         # 数据源工具
│   └── StreamAudioConstraints.js     # 音频约束配置
└── webrtc/
    ├── index.js                      # WebRTC 模块入口
    ├── StreamPublisher.js            # 音频推流
    ├── StreamSubscriber.js           # 音频订阅
    └── common/
        └── StreamVolumeMeter.js      # 音量监听器

注意事项

  1. HTTPS 要求:H5 环境需要 HTTPS 协议才能使用麦克风(localhost 除外)
  2. 仅支持 H5:本插件仅支持 H5 平台,不支持 App 和小程序
  3. 浏览器兼容性:需要浏览器支持 MediaRecorder API 和 Web Audio API
  4. 临时文件:H5 环境生成的是 Blob URL,需及时处理
  5. 建议佩戴耳机:实时通话场景建议佩戴耳机以避免声音回环

技术支持

如有问题请通过插件市场评论区反馈

隐私、权限声明

1. 本插件需要申请的系统权限列表:

麦克风权限

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议