使用 uni.getRecorderManager 进行录制
通过 uni.getRecorderManager 获取全局唯一的录音管理器 recorderManager。
示例:
<template><view><button @tap="startRecord">开始录音</button><button @tap="endRecord">停止录音</button><button @tap="playVoice">播放录音</button></view></template><script>const recorderManager = uni.getRecorderManager();const innerAudioContext = uni.createInnerAudioContext();innerAudioContext.autoplay = true;export default {data: {voicePath: ''},onLoad() {recorderManager.onStop(function (res) {console.log('recorder stop' + JSON.stringify(res));let path = res.tempFilePath; // 临时文件路径// 上传的处理...});},methods: {startRecord() {console.log('开始录音');recorderManager.start({format: 'mp3', duration: 60000, sampleRate: 48000, encodeBitRate: 128000});},endRecord() {console.log('录音结束');recorderManager.stop();},playVoice() {console.log('播放录音');if (this.voicePath) {innerAudioContext.src = this.voicePath;innerAudioContext.play();}}}}</script>

比起 plus.audio.getRecorder 在安卓端录制的是 amr 格式,通过 uni.getRecorderManager 进行录制的音频可以指定为 aac/mp3 格式,更有利于网页中播放,而不需要额外的转码
方法与事件
方法
- start options 开始录音
 - pause 暂停录音
 - resume 继续录音
 - stop 停止录音
 
事件
- onStart 录音开始事件
 - onPause 录音暂停事件
 - onStop 录音停止事件,会回调文件地址
 - onFrameRecorded 已录制完指定帧大小的文件,会回调录音分片结果数据。如果设置了 frameSize ,则会回调此事件
 - onError 录音错误事件, 会回调错误信息
 
:::info 开发者工具上的录音文件与移动端格式不同,暂时只可在工具上进行播放调试,无法直接播放或者在客户端上播放 :::
开始录音
使用 start 方法开始录音, 同时触发 onStart 事件, start 方法接收一个 options 参数, 用于配置录音设备:
| 属性 | 类型 | 必填 | 说明 | 
|---|---|---|---|
| duration | Number | 否 | 指定录音的时长,单位 ms ,如果传入了合法的 duration ,在到达指定的 duration 后会自动停止录音,最大值 600000(10 分钟),默认值 60000(1 分钟) | 
| sampleRate | Number | 否 | 采样率,有效值 8000/16000/44100 | 
| numberOfChannels | Number | 否 | 录音通道数,有效值 1/2 | 
| encodeBitRate | Number | 否 | 编码码率,有效值见下表格 | 
| format | String | 否 | 音频格式,有效值 aac/mp3 | 
| frameSize | String | 否 | 指定帧大小,单位 KB。传入 frameSize 后,每录制指定帧大小的内容后,会回调录制的文件内容,不指定则不会回调。暂仅支持 mp3 格式。 | 
其中,采样率和码率有一定要求,具体有效值如下:
| 采样率 | 编码码率 | 
|---|---|
| 8000 | 16000 ~ 48000 | 
| 11025 | 16000 ~ 48000 | 
| 12000 | 24000 ~ 64000 | 
| 16000 | 24000 ~ 96000 | 
| 22050 | 32000 ~ 128000 | 
| 24000 | 32000 ~ 128000 | 
| 32000 | 48000 ~ 192000 | 
| 44100 | 64000 ~ 320000 | 
| 48000 | 64000 ~ 320000 | 
结束录音
使用 stop 方法结束录音, 同时触发 onStop 事件, onStop 可获得录音文件的临时路径:
recorderManager.onStop(res => {console.log('recorder stop' + JSON.stringify(res));this.voicePath = res.tempFilePath;});
audio 组件
uni-app 内置音频组件 audio,使用方式如下:
<template lang="pug">.contentaudio#audio(controlssrc='/static/music.jpg'poster='致爱丽丝'name='暂无'author='/static/music.mp3'@play="play"@pause="pause"@ended="ended")</template>
audio 组件的属性有:
- src 要播放音频的资源地址,本地路径或网络路径
 - loop 默认为false,是否循环播放
 - controls 默认为false,是否显示默认控件
 - poster 默认控件上的音频封面的图片资源地址,如果 controls 属性值为 false 则设置 poster 无效
 - name 未知音频 默认控件上的音频名字,如果 controls 属性值为 false 则设置 name 无效
 - author 未知作者 默认控件上的作者名字,如果 controls 属性值为 false 则设置 author 无效
 
audio 组件的事件有:
- error 当发生错误时触发 error 事件,detail = {errMsg: MediaError.code}
 - play 当开始/继续播放时触发play事件
 - pause 当暂停播放时触发 pause 事件
 - timeupdate 当播放进度改变时触发 timeupdate 事件,detail = {currentTime, duration}
 - ended 当播放到末尾时触发 ended 事件
 
音频组件上下文
通过 uni.createInnerAudioContext() 创建并返回内部 audio 上下文 innerAudioContext 对象。
const innerAudioContext = uni.createInnerAudioContext();innerAudioContext.autoplay = true;innerAudioContext.src = 'https://img-cdn-qiniu.dcloud.net.cn/uniapp/audio/music.mp3';innerAudioContext.onPlay(() => {console.log('开始播放');});innerAudioContext.onError((res) => {console.log(res.errMsg);console.log(res.errCode);});
innerAudioContext 对象的属性列表
| 属性 | 类型 | 说明 | 只读 | 
|---|---|---|---|
| src | String | 音频的数据链接,用于直接播放。 | 否 | 
| startTime | Number | 开始播放的位置(单位:s),默认 0 | 否 | 
| autoplay | Boolean | 是否自动开始播放,默认 false | 否 | 
| loop | Boolean | 是否循环播放,默认 false | 否 | 
| obeyMuteSwitch | Boolean | 是否遵循系统静音开关,当此参数为 false 时,即使用户打开了静音开关,也能继续发出声音,默认值 true | 否 | 
| duration | Number | 当前音频的长度(单位:s),只有在当前有合法的 src 时返回 | 是 | 
| currentTime | Number | 当前音频的播放位置(单位:s),只有在当前有合法的 src 时返回,时间不取整,保留小数点后 6 位 | 是 | 
| paused | Boolean | 当前是是否暂停或停止状态,true 表示暂停或停止,false 表示正在播放 | 是 | 
| buffered | Number | 音频缓冲的时间点,仅保证当前播放时间点到此时间点内容已缓冲。 | 是 | 
| volume | Number | 音量。范围 0~1。 | 否 | 
innerAudioContext 对象的方法列表
| 方法 | 参数 | 说明 | 
|---|---|---|
| play | 播放 | |
| pause | 暂停 | |
| stop | 停止 | |
| seek | position | 跳转到指定位置,单位 s | 
| destroy | position | 销毁当前实例 | 
innerAudioContext 对象的事件列表
| 方法 | 参数 | 说明 | 
|---|---|---|
| onCanplay | callback | 音频进入可以播放状态,但不保证后面可以流畅播放 | 
| onPlay | callback | 音频播放事件 | 
| onPause | callback | 音频暂停事件 | 
| onStop | callback | 音频停止事件 | 
| onEnded | callback | 音频自然播放结束事件 | 
| onTimeUpdate | callback | 音频播放进度更新事件 | 
| onError | callback | 音频播放错误事件 | 
| onWaiting | callback | 音频加载中事件,当音频因为数据不足,需要停下来加载时会触发 | 
| onSeeking | callback | 音频进行 seek 操作事件 | 
| onSeeked | callback | 音频完成 seek 操作事件 | 
| offCanplay | callback | 取消监听 onCanplay 事件 | 
| offPlay | callback | 取消监听 onPlay 事件 | 
| offPause | callback | 取消监听 onPause 事件 | 
| offStop | callback | 取消监听 onStop 事件 | 
| offEnded | callback | 取消监听 onEnded 事件 | 
| offTimeUpdate | callback | 取消监听 onTimeUpdate 事件 | 
| offError | callback | 取消监听 onError 事件 | 
| offWaiting | callback | 取消监听 onWaiting 事件 | 
| offSeeking | callback | 取消监听 onSeeking 事件 | 
| offSeeked | callback | 取消监听 onSeeked 事件 | 
背景音乐上下文
通过 uni.getBackgroundAudioManager() 获取全局唯一的背景音频管理器 backgroundAudioManager。
const bgAudioMannager = uni.getBackgroundAudioManager();bgAudioMannager.title = '致爱丽丝';bgAudioMannager.singer = '暂无';bgAudioMannager.coverImgUrl = 'https://img-cdn-qiniu.dcloud.net.cn/uniapp/audio/music.jpg';bgAudioMannager.src = 'https://img-cdn-qiniu.dcloud.net.cn/uniapp/audio/music.mp3';
backgroundAudioManager 对象的属性列表
| 属性 | 类型 | 说明 | 只读 | 
|---|---|---|---|
| duration | Number | 当前音频的长度(单位:s),只有在当前有合法的 src 时返回 | 是 | 
| currentTime | Number | 当前音频的播放位置(单位:s),只有在当前有合法的 src 时返回 | 是 | 
| paused | Boolean | 当前是是否暂停或停止状态,true 表示暂停或停止,false 表示正在播放 | 是 | 
| src | String | 音频的数据源,默认为空字符串,当设置了新的 src 时,会自动开始播放,目前支持的格式有 m4a, aac, mp3, wav | 否 | 
| startTime | Number | 音频开始播放的位置(单位:s) | 否 | 
| buffered | Number | 音频缓冲的时间点,仅保证当前播放时间点到此时间点内容已缓冲。 | 是 | 
| title | String | 音频标题,用于做原生音频播放器音频标题。原生音频播放器中的分享功能,分享出去的卡片标题,也将使用该值。 | 否 | 
| epname | String | 专辑名,原生音频播放器中的分享功能,分享出去的卡片简介,也将使用该值。 | 否 | 
| singer | String | 歌手名,原生音频播放器中的分享功能,分享出去的卡片简介,也将使用该值。 | 否 | 
| coverImgUrl | String | 封面图url,用于做原生音频播放器背景图。原生音频播放器中的分享功能,分享出去的卡片配图及背景也将使用该图。 | 否 | 
| webUrl | String | 页面链接,原生音频播放器中的分享功能,分享出去的卡片简介,也将使用该值。 | 否 | 
| protocol | String | 音频协议。默认值为 ‘http’,设置 ‘hls’ 可以支持播放 HLS 协议的直播音频 | 否 | 
backgroundAudioManager 对象的方法列表
| 方法 | 参数 | 说明 | 
|---|---|---|
| play | 播放 | |
| pause | 暂停 | |
| stop | 停止 | |
| seek | position | 跳转到指定位置,单位 s | 
backgroundAudioManager 对象的事件列表
| 方法 | 说明 | 
|---|---|
| onCanplay | 背景音频进入可以播放状态,但不保证后面可以流畅播放 | 
| onPlay | 背景音频播放事件 | 
| onPause | 背景音频暂停事件 | 
| onStop | 背景音频停止事件 | 
| onEnded | 背景音频自然播放结束事件 | 
| onTimeUpdate | 背景音频播放进度更新事件 | 
| onPrev | 用户在系统音乐播放面板点击上一曲事件(iOS only) | 
| onNext | 用户在系统音乐播放面板点击下一曲事件(iOS only) | 
| onError | 背景音频播放错误事件 | 
| onWaiting | 音频加载中事件,当音频因为数据不足,需要停下来加载时会触发 | 
通过 plus.audio.getRecorder 获取录音设备
以下示例演示通过调用录音设备进行音频录制并上传到OSS,先上代码:
<template><view><view class=""><button type="primary" @click="startRecord">开始录音</button></view><view class=""><button type="primary" @click="stopRecord">结束录音</button></view></view></template><script>export default {data() {return {r: null};},created () {this.r = plus.audio.getRecorder();console.log(this.r.supportedFormats);},methods: {startRecord() {if ( this.r == null ) {console.log( "Device not ready!" );return;}let vm = thisthis.r.record({filename:"_doc/audio/"}, function (path) {console.log( "Audio record success :" + path ); // 临时文件路径// 上传的处理...}, function (e) {console.log( "Audio record failed: " + e.message );});},stopRecord() {this.r.stop();}}}</script>
以上方式录制的音频, 不同设备在格式上有所不同:
- Android - 2.2+ (支持): Android平台支持”amr”、”3gp”格式,默认为”amr”。
 - iOS - 4.5+ (支持): iOS平台支持”wav”、”aac”、”amr”格式,默认为”wav”。
 
获取录音对象
语法格式:
AudioRecorder plus.audio.getRecorder();
AudioRecorder对象
interface AudioRecorder {readonly attribute String[] supportedSamplerates;readonly attribute String[] supportedFormats;function record( option, successCB, errorCB );function stop();}
属性:
- supportedSamplerates: 数组,支持的录音采样率,字符串格式为“采样频率”,如“8000”;其单位为Hz。
 - supportedFormats: 数组,支持的录音文件的格式,字符串格式为文件格式后缀名,如”mp3”、”aac”、”wav”等 (不同设备支持程度不一致, 上面有说到)
 
方法:
- record: 调用设备麦克风进行录音操作
 - stop: 结束录音操作
 
录音
通过 record 方法调用设备麦克风进行录音操作
recorder.record( option, successCB, errorCB );
选项
option 为 AudioRecorderStyles 对象, 包括如下属性:
- channels: (String 类型 )录音声道, 可取值: “mono” - 单声道录音; “stereo” - 立体声道录音。 默认值为”mono”。
 - filename: (String 类型 )保存录音文件的路径, 可设置具体文件名,也可只设置路径,如果以“/”结尾则表明是路径,文件名由录音程序自动生成。 如未设置则使用默认目录生成随机文件名称,默认目录为应用%APPID%下的documents目录。
 - samplerate: (String 类型 )录音文件的采样率, 需通过supportedSamplerates属性获取设备支持的采样率,若设置无效的值,则使用系统默认的采样率。
 - format: (String 类型 )录音文件的格式, 需通过supportedFormats属性获取设备支持的录音格式,若设置无效的值,则使用系统默认的录音格式。
 
回调
- successCB: (RecordSuccessCallback) 必选 录音操作成功的回调函数, 接收一个参数 recordFile, 为录音成功后的文件临时路径
 - errorCB: (AudioErrorCallback) 可选 录音操作失败的回调函数, 接收一个参数 error, 为录音失败后的错误
 
:::warning 录音对象是设备的独占资源,在同一时间仅可执行一个录音操作,否则可能会导致操作失败。 :::
