更新记录

1.0.0(2026-07-21)

首发:opus 音频编解码。

  • packet 级流式编解码:有状态编解码器+显式生命周期;16kbps 恒定码率每帧稳定 40B,适合对讲/连麦/IM 语音消息按帧走网络
  • 文件级 WAV↔opus 转码:标准 ogg/opus 容器产物主流播放器可播,样本数精确还原
  • 参数越界/坏包/释放后调用一律安全拒绝,不闪退
  • App-Android(3 ABI)+ App-iOS(iOS 14+);H5/小程序不支持(能力探测 platformCapabilities)

平台兼容性

uni-app x(5.14)

Chrome Safari Android iOS 鸿蒙 微信小程序
× × 5.0 × ×

nex-opus 音频编解码(opus 格式)

uni-app x 的 opus 音频编解码插件:packet 级流式编解码(对讲 / 实时语音传输)+ 文件级 WAV↔opus 转码(录音存储 / 传输省流量)。高性能原生实现,全程离线,无网络依赖。

为什么选 opus

  • 体积:16kbps 规格下 1 秒语音仅约 2KB(原始 PCM 32KB,压缩 16:1);一分钟录音 ≈120KB。
  • 实时:20ms 一帧、恒定码率可选,帧长可预期(16kbps CBR 每帧稳定 40 字节),适合对讲、 连麦、IM 语音消息、IoT 语音透传等按帧走网络的场景。
  • 通用:opus 是 WebRTC / 主流 IM 通用的开放音频格式,产物 .opus(ogg 容器)主流播放器可直接播。

支持端

支持 说明
App-Android arm64-v8a / armeabi-v7a / x86_64
App-iOS iOS 14+
H5 / 小程序 音频编解码为 App 端原生能力;platformCapabilities() 可探测

快速开始

流式编解码(对讲/实时语音)

import { createOpusEncoder, createOpusDecoder } from '@/uni_modules/nex-opus'

// 16kHz 单声道 / 16kbps / 20ms 帧 / 恒定码率(对讲推荐规格)
const enc = createOpusEncoder({
  sampleRate: 16000, channels: 1, bitrate: 16000,
  cbr: true, frameMs: 20, application: 'voip'
})
const dec = createOpusDecoder({ sampleRate: 16000, channels: 1 })

const frameLen = enc!.frameSamples() // 320:每帧样本数,录音回调按此切帧
// pcm: number[],16bit 有符号样本(-32768..32767),长度 = frameLen × channels
const packet = enc!.encodeFrame(pcm)   // 一帧 → 一个 opus packet(number[] 字节)
const pcmOut = dec!.decodePacket(packet) // 一个 packet → 一帧 PCM

enc!.destroy(); dec!.destroy()  // 用完显式释放

文件转码(录音压缩存储)

import { opusEncodeWavFile, opusDecodeFileToWav } from '@/uni_modules/nex-opus'

// WAV → .opus(ogg/opus 容器,主流播放器可播)
const stats = await opusEncodeWavFile(srcWavPath, outOpusPath, 24000)
console.log(`压缩后 ${stats.bytesOut} 字节 / ${stats.frames} 帧 / ${stats.durationMs}ms`)

// .opus → WAV(样本数精确还原)
await opusDecodeFileToWav(opusPath, outWavPath)

API 一览

API 形态 说明
createOpusEncoder(options) 同步 建流式编码器;参数越界拒绝不静默修正
createOpusDecoder(options) 同步 建流式解码器
OpusEncoder.encodeFrame(pcm) 同步 一帧 PCM → 一个 packet(µs~ms 级,适合录音回调内联调用)
OpusDecoder.decodePacket(packet) 同步 一个 packet → 一帧 PCM;坏包安全拒绝不闪退
resetState() / destroy() 同步 流中断重同步 / 显式释放
frameSamples() / sampleRate() / channelCount() 同步 创建参数快照
opusEncodeWavFile(in, out, bitrate) Promise WAV → .opus(后台线程,不冻 UI)
opusDecodeFileToWav(in, out) Promise .opus → WAV
opusVersion() / platformCapabilities() 同步 版本 / 端能力探测

参数合法值(越界报错,不静默修正):sampleRate ∈ 8000/12000/16000/24000/48000; channels 1/2;bitrate [6000, 510000];frameMs ∈ 2.5/5/10/20/40/60; application voip/audio/lowdelay

错误行为(双端差异)

  • Android:参数越界 / 坏包 / 已 destroy 抛异常(message 含详情),try/catch 捕获。
  • iOS:同场景哨兵返回create* 返回 nullencodeFrame/decodePacket 返回空数组), 详情见控制台日志;文件级 Promise 双端一致 reject。

注意事项

  • WAV 仅支持 16bit PCM、采样率须在合法值列表内(本插件不做重采样,越界明确报错)。
  • 录音采集本身请用 uni 录音 API / 原生录音插件;本插件专注编解码(PCM 进出)。
  • packet 是「一帧一包」:网络传输自行组帧(长度前缀 / WebSocket 二进制帧均可)。

隐私、权限声明

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

无需任何权限(编解码为纯计算;文件级 API 读写调用方传入的路径)。

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

插件不采集任何数据。编解码全程本地完成,无任何网络请求、不发送数据到任何服务器。

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

暂无用户评论。