使用 uni.getRecorderManager 进行录制

通过 uni.getRecorderManager 获取全局唯一的录音管理器 recorderManager。

示例:

  1. <template>
  2. <view>
  3. <button @tap="startRecord">开始录音</button>
  4. <button @tap="endRecord">停止录音</button>
  5. <button @tap="playVoice">播放录音</button>
  6. </view>
  7. </template>
  8. <script>
  9. const recorderManager = uni.getRecorderManager();
  10. const innerAudioContext = uni.createInnerAudioContext();
  11. innerAudioContext.autoplay = true;
  12. export default {
  13. data: {
  14. voicePath: ''
  15. },
  16. onLoad() {
  17. recorderManager.onStop(function (res) {
  18. console.log('recorder stop' + JSON.stringify(res));
  19. let path = res.tempFilePath; // 临时文件路径
  20. // 上传的处理...
  21. });
  22. },
  23. methods: {
  24. startRecord() {
  25. console.log('开始录音');
  26. recorderManager.start({format: 'mp3', duration: 60000, sampleRate: 48000, encodeBitRate: 128000});
  27. },
  28. endRecord() {
  29. console.log('录音结束');
  30. recorderManager.stop();
  31. },
  32. playVoice() {
  33. console.log('播放录音');
  34. if (this.voicePath) {
  35. innerAudioContext.src = this.voicePath;
  36. innerAudioContext.play();
  37. }
  38. }
  39. }
  40. }
  41. </script>

005.png
比起 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 可获得录音文件的临时路径:

  1. recorderManager.onStop(res => {
  2. console.log('recorder stop' + JSON.stringify(res));
  3. this.voicePath = res.tempFilePath;
  4. });

audio 组件

uni-app 内置音频组件 audio,使用方式如下:

  1. <template lang="pug">
  2. .content
  3. audio#audio(controls
  4. src='/static/music.jpg'
  5. poster='致爱丽丝'
  6. name='暂无'
  7. author='/static/music.mp3'
  8. @play="play"
  9. @pause="pause"
  10. @ended="ended"
  11. )
  12. </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 对象。

  1. const innerAudioContext = uni.createInnerAudioContext();
  2. innerAudioContext.autoplay = true;
  3. innerAudioContext.src = 'https://img-cdn-qiniu.dcloud.net.cn/uniapp/audio/music.mp3';
  4. innerAudioContext.onPlay(() => {
  5. console.log('开始播放');
  6. });
  7. innerAudioContext.onError((res) => {
  8. console.log(res.errMsg);
  9. console.log(res.errCode);
  10. });

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。

  1. const bgAudioMannager = uni.getBackgroundAudioManager();
  2. bgAudioMannager.title = '致爱丽丝';
  3. bgAudioMannager.singer = '暂无';
  4. bgAudioMannager.coverImgUrl = 'https://img-cdn-qiniu.dcloud.net.cn/uniapp/audio/music.jpg';
  5. 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,先上代码:

  1. <template>
  2. <view>
  3. <view class="">
  4. <button type="primary" @click="startRecord">开始录音</button>
  5. </view>
  6. <view class="">
  7. <button type="primary" @click="stopRecord">结束录音</button>
  8. </view>
  9. </view>
  10. </template>
  11. <script>
  12. export default {
  13. data() {
  14. return {
  15. r: null
  16. };
  17. },
  18. created () {
  19. this.r = plus.audio.getRecorder();
  20. console.log(this.r.supportedFormats);
  21. },
  22. methods: {
  23. startRecord() {
  24. if ( this.r == null ) {
  25. console.log( "Device not ready!" );
  26. return;
  27. }
  28. let vm = this
  29. this.r.record({filename:"_doc/audio/"}, function (path) {
  30. console.log( "Audio record success :" + path ); // 临时文件路径
  31. // 上传的处理...
  32. }, function (e) {
  33. console.log( "Audio record failed: " + e.message );
  34. });
  35. },
  36. stopRecord() {
  37. this.r.stop();
  38. }
  39. }
  40. }
  41. </script>

以上方式录制的音频, 不同设备在格式上有所不同:

  • Android - 2.2+ (支持): Android平台支持”amr”、”3gp”格式,默认为”amr”。
  • iOS - 4.5+ (支持): iOS平台支持”wav”、”aac”、”amr”格式,默认为”wav”。

获取录音对象

语法格式:

  1. AudioRecorder plus.audio.getRecorder();

AudioRecorder对象

  1. interface AudioRecorder {
  2. readonly attribute String[] supportedSamplerates;
  3. readonly attribute String[] supportedFormats;
  4. function record( option, successCB, errorCB );
  5. function stop();
  6. }

属性:

  • supportedSamplerates: 数组,支持的录音采样率,字符串格式为“采样频率”,如“8000”;其单位为Hz。
  • supportedFormats: 数组,支持的录音文件的格式,字符串格式为文件格式后缀名,如”mp3”、”aac”、”wav”等 (不同设备支持程度不一致, 上面有说到)

方法:

  • record: 调用设备麦克风进行录音操作
  • stop: 结束录音操作

录音

通过 record 方法调用设备麦克风进行录音操作

  1. 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 录音对象是设备的独占资源,在同一时间仅可执行一个录音操作,否则可能会导致操作失败。 :::

参考资料