x-mediaplay-s 媒体播放与录制
音频播放与录音。播放走系统播放器;录音输出 mp3 / wav。全局单例,新的播放或录音会抢占上一会话。
兼容性
| Harmony | IOS | Android | WEB | 小程序 |
|---|---|---|---|---|
| 支持 | 支持 | 支持 | 支持 | 支持 |
调用
import { startRecord, stopRecord, play, pause, resume, stop } from "@/uni_modules/x-mediaplay-s"
startRecord({
format: "mp3",
sampleRate: 16000,
channelCount: 1,
bitrate: 48,
maxDurationMs: 60000,
levelInterval: 150,
onLevel: (db) => {
console.log(db)
},
onWave: (value) => {
console.log(value)
},
success: (res) => {
console.log(res.path, res.durationMs)
}
})
play({
url: recordedPath,
autoplay: true,
volume: 1,
infoInterval: 300,
onInfo: (info) => {
console.log(info.state, info.current, info.total)
}
})方法
| 名称 | 需要 | 说明 |
|---|---|---|
| play | XMediaPlayOptions,见下方 | 播放音频,会抢占上一会话 |
| pause | 无 | 暂停 |
| resume | 无 | 从暂停处继续 |
| stop | 无 | 停止播放 |
| seek | positionMs: number | 跳到指定毫秒 |
| setVolume | volume: number,0~1 | 设置音量 |
| getPlayInfo | 无 | 返回 { current, total, state, percent } |
| isPlaying | 无 | 是否正在播放 |
| startRecord | XMediaRecordOptions,见下方 | 开始录音,会抢占上一会话 |
| stopRecord | 无 | 停止并保存,走 success |
| cancelRecord | 无 | 取消并丢弃当前录音 |
| getRecordState | 无 | 返回 idle / recording / stopping |
| isRecording | 无 | 是否正在录音 |
| getVersion | 无 | 原生核心版本,微信为空 |
参数
XMediaPlayOptions
| 字段 | 说明 | 默认 |
|---|---|---|
| url | 本地 / http(s) / blob | 必填 |
| autoplay | 就绪后自动播 | true |
| loop | 循环 | false |
| volume | 音量 0~1 | 1 |
| startPosition | 起播位置 ms | 0 |
| infoInterval | onInfo 间隔 ms,小于 100 按 100 | 500 |
| onInfo | 进度与状态 | - |
| success | 起播成功 | - |
| fail | 失败 | - |
| complete | 结束 | - |
XMediaRecordOptions
| 字段 | 说明 | 默认 |
|---|---|---|
| format | mp3 / wav | mp3 |
| sampleRate | 采样率,wav 可用 44100 | 16000 |
| channelCount | 声道 | 1 |
| bitrate | mp3 码率 kbps,wav 忽略 | 48 |
| maxDurationMs | 到点自动 success | 60000 |
| savePath | 输出路径,Web 忽略 | 各端缓存 |
| levelInterval | onLevel / onWave 间隔 ms | 200 |
| onLevel | 音量 dBFS,[-100, 0] | - |
| onWave | 波纹峰值,[-1, 1];微信不回调 | - |
| success | 正常结束 | - |
| fail | 失败 | - |
| complete | 结束 | - |
XMediaPlayInfo:current / total(ms,未知为 -1)、state、percent(缓冲 0~100)。
XMediaRecordResult:path、format、durationMs、size、sampleRate、channelCount。Web 的 path 为 blob。
平台差异
- Web 需 HTTPS 或 localhost;
savePath忽略;无用户手势时 autoplay 可能失败。 - 微信:
onLevel/onWave不回调(签名保留);maxDurationMs上限 600000;getVersion()为空;结果为临时路径。 - 录音需要麦克风权限。
版本
版权归https://xui.tmui.design你不得修改及二次开发,仅供TMUI4会员商用使用。不得转给非VIP会员使用,一经查实数倍赔偿,并追究法律责任。
更新日志
1.0.3(2026-08-15)
录制增加 onWave 波纹回调。录制期间按 levelInterval 上报当前采集窗的归一化峰值,范围 [-1, 1],方便外部画微信/iOS 式波形。Android / iOS / HarmonyOS / Web 从 PCM 取绝对值最大采样并保留符号;微信小程序无采集帧接口,签名保留但不回调。测试页用不超过 12 根柱循环展示录制波纹。
1.0.2(2026-08-05)
修复单声道 MP3 录音全是噪声(滋滋声)。共享核心的 Mp3Encoder 一律调用 lame_encode_buffer_interleaved,而该接口内部把读取步长写死为 2(lame_copy_inbuffer(..., jump=2)), 只适用于立体声交错数据。单声道缓冲区只有 frames 个采样,LAME 却按 pcm[0], pcm[2], … pcm[2*frames-2] 去读,导致两个后果叠加:前半段信号被抽取成二倍频混叠,后半段读到缓冲区之外的堆内存。 默认录音配置就是单声道,因此 Android / iOS / HarmonyOS / Web 四端的 MP3 录音全部受影响(WAV 为裸拷贝,不受影响)。 现改为单声道走步长为 1 的 lame_encode_buffer,立体声保持 interleaved。
- 四端原生产物(HAR / AAR / framework / wasm)均已重新构建,升级后需重新打包自定义基座。
- 宿主测试新增
mono_mp3_fidelity:编码 1kHz 单声道正弦后用afconvert解码回 PCM, 以 Goertzel 量测 1kHz 与 2kHz 分量。修复前 1kHz 幅度仅 0.75(原始音调消失),修复后为 15565。 此前的断言只检查文件魔数与大小,无法发现内容层面的损坏。
1.0.1(2026-08-04)
单例与抢占语义。插件全局仍只有一个播放器、一个录制会话,但不再要求调用方先 stop 再重新开始:
- 播放:新的
play()抢占旧会话,旧会话必定收到onInfo(stop);尚未起播成功的再补fail(1009)+complete(null)。stop()在起播就绪前调用也会补终态。此前旧 options 的回调会被静默丢弃,调用方永远等不到complete,闭包也一直被@UTSJS.keepAlive持有。 - 录制:
startRecord()在录制中调用时,先把上一段正常收尾(出文件、旧success拿到完整结果)再启动新录制,不丢数据;此前直接fail(1010)拒绝。 - 五端共用新的
libs/session.uts做会话仲裁,success/fail/complete严格只触发一次,抢占后立即释放旧回调引用;被抢占会话的迟到事件按会话 id 丢弃。 - HarmonyOS:
teardown改为等AudioCapturer真正stop()+release()完成后再置 idle 并回调onDone,避免紧接着开新录音时撞上仍被占用的麦克风。 - 错误码 1009 语义扩展为「操作已取消或被新的请求中断」,具体原因见
errMsg。
1.0.0(2026-08-04)
首个可用版本,五端(Android / iOS / HarmonyOS / Web / 微信小程序)播放与录制全部落地。
播放:各端系统播放器统一到一套状态机与进度回调(onInfo + success/fail/complete),支持 pause/resume/seek/setVolume/getPlayInfo。
录制:采集 PCM → C++ 共享核心(声道合并 + 有理数相位重采样 + 流式编码 MP3(LAME)/WAV)。 Android 走 AudioRecord + JNI,iOS 走 AVAudioEngine + ObjC++,HarmonyOS 走 AudioCapturer + NAPI, Web 走 AudioWorklet + WASM,微信小程序走平台 RecorderManager 直出。 支持时长上限自动停止(默认 60s)、onLevel 实时 dBFS 音量回调、cancelRecord 丢弃产物。
