收藏
评论

(7)小程序音频能力介绍官方

小程序支持播放和录制音频。小程序播放音频的方式有两种:内部音频和背景音频。

1.内部音频支持用户在使用小程序过程中播放音效;
2.背景音频支持在用户离开小程序后继续播放音效。

一、播放音频

(一)背景音频

播放背景音频
背景音频接口适用于音乐类小程序,如“音乐站”、“QQ 音乐小电台”。通过 wx.getBackgroundAudioManager() 接口可以获取全局唯一的背景音频管理器,所有关于背景音频的操作都由它来实现。

微信内只有一个背景音频,一个小程序开始播放背景音频之后,就持有背景音频播放器,只要当前小程序持有背景音频播放器,即使这个小程序进入后台(即用户离开小程序),也可以继续使用背景音频接口,且当前小程序不会被微信主动回收;一旦背景音频播放器被抢占(可能是其他小程序、微信内其他音乐、其他 App 的音乐),则小程序不再持有背景音频播放器。



(音乐站小程序)


在系统播放面板显示和控制

通过设置标题、专辑名、歌手名、封面图等属性,小程序音频接口支持在系统音乐播放面板显示出来。通过响应系统面板的点击事件(onPrevonNext),可以实现列表播放。



系统播放面板控制效果)

(二)内部音频

播放内部音频

内部音频适用于所有小程序,尤其是游戏类目的小程序,如“跳一跳”。通过 wx.createInnerAudioContext() 接口可以创建一个音频实例。


每个小程序可以同时持有和播放多个内部音频,但一旦小程序进入后台(onHide),所有内部音频都会被暂停,且在用户回到前台(即打开小程序)之前无法再被播放。

静音下也能播放

在 iOS 系统中,内部音频默认遵循静音键设置。如果希望在静音时也能播放,可以设置 obeyMuteSwitch false


安卓系统没有统一的静音开关,暂不支持此特性。

处理音频中断事件

以游戏为例,在游戏中,经常有播放使用内部音频来播放游戏背景音乐的场景。音频中断事件指的是在游戏期间,音频被系统打断时触发的事件。音频中断事件分为中断开始和中断结束事件,分别使用 wx.onAudioInterruptionBegin() wx.onAudioInterruptionEnd() 来监听。

以下事件会触发音频中断开始事件:接到电话、闹钟响起、系统提醒、收到微信好友的语音/视频通话请求。被中断之后,小游戏内所有音频会被暂停,并在中断结束之前都不能再播放成功。

中断结束之后,被暂停的音频不会自动继续播放,游戏可监听音频中断结束事件,并在收到中断结束事件之后调用背景音乐继续播放。


如果游戏的逻辑强依赖音乐的播放(如音乐类游戏),需要在音频开始中断的时候暂停游戏



(跳一跳小游戏)


二、录制音频

通过 wx.getRecorderManager 接口,可以获取全局唯一的录音管理器。


实现边录边传
认情况下,录音结束后会生成一个本地文件,并通过回调返回本地文件的地址。对于实时性要求比较高的小程序(如“面对面翻译”),可以通过设置 frameSize 参数来设置一个帧的大小,这样每录制指定帧大小的内容后,会通过 onFrameRecorded 回调返回本次分片的数据。


注意事项:不建议使用的历史接口

上述接口可以满足所有音频相关的需求。除了上述接口,小程序内还有若干跟音频相关的接口(如 wx.startRecordwx.playVoicewx.playBackgroundAudio 等)。这些接口由于早期设计存在一些缺陷,我们不建议继续使用。


38908浏览
最后一次编辑于  2018-08-17
知识库内容非实时更新,可能已过期、失效或不适用于当前情形,请谨慎参考
收藏
反馈

26 个评论

  • 文科
    文科
    2019-08-19

    如果设定:

    const options = {
    duration: 2000,
    sampleRate: 44100,
    numberOfChannels: 1,
    encodeBitRate: 192000,
    format: 'aac',
    frameSize: 1000
    }
     
    recorderManager.start(options)

    那么

    recorderManager.onFrameRecorded((res) => {
        })


    返回的res中的音频片段的编码格式是aac还是什么?

    也就是说这个编码格式是和上面的options保持一致么?

    2019-08-19
    赞同
    回复
  • 许你余生
    许你余生
    2019-01-28

    在app里面加全局背景音乐   关闭小程序再次打开  app里面onShow触发play不播放  咋处理

    2019-01-28
    赞同
    回复
  • Hshuai
    Hshuai
    2018-12-26

    get

    2018-12-26
    赞同
    回复
  • 遇见
    遇见
    2018-07-23

    wx.getBackgroundAudioManager()

    为什么在安卓只会播放一次,在IOS可以每次摇都播放   还有就是返回来的属性在onCanplay等方法外打印不出来,必须在onCanplay等方法内才能用么?

    onload(){     const backGroundAudioManger = wx.getBackGroundAudioManger();    this.backGroundAudioManger  = backGroundAudioManger; },


    ...  // 手机摇晃触发playMusic


    /**

    * 摇一摇播放音乐 **/

    playMusic(){     if(!this.backGroundAudioManger.src) {          this.backGroundAudioManger.title = '微信摇一摇',

             this.backGroundAudioManger.src= 'http://fjyd.sc.chinaz.com/files/download/sound1/201410/5018.mp3'         }

        this.backGroundAudioManger.onCanplay(()=> {

            if(this.backGroundAudioManger.paused) { // 暂停或停止               this.backGroundAudioManger.play();           }     })}

    2018-07-23
    赞同
    回复
  • Derrick舰长
    Derrick舰长
    2018-07-12

    这篇文章写的好。 好像产品经理写的。

    音频组件那一页的好像工程师写的文档。




    2018-07-12
    赞同
    回复
  • 微程序猿
    微程序猿
    2018-06-27

    wx.getBackgroundAudioManager()为啥不能播放本地音乐?如果设src=‘/audio/sample.mp3’,调试器和安卓真机上都不会报任何错,只是播放器界面闪退,不发声。用ios真机调试,会报如下错:setBackgroundAudioState:fail src is not http or https stream!


    2018-06-27
    赞同
    回复
  • Szzzzzz🐯
    Szzzzzz🐯
    2018-06-12

    已解决,是因为授权的原因

    2018-06-12
    赞同
    回复
  • 闫峰
    闫峰
    2018-05-24
    1. wx.startRecord 不能用了啊?

    2. getRecorderManager.start 只有两个格式,如果语音识别还要自己解码,能提供编码前的pcm或者wav格式么?amr也行啊

    2018-05-24
    赞同
    回复
  • Szzzzzz🐯
    Szzzzzz🐯
    2018-05-12

    我正在使用getRecorderManager这个api的时候,它直接走了错误回调的,并没有走开始的函数,为什么


    2018-05-12
    赞同
    回复 3
    • 小程序/小游戏开发-Link
      小程序/小游戏开发-Link
      2018-05-18
      需要提供更多信息方可定位问题
      2018-05-18
      回复
    • 乔一
      乔一
      2018-05-29

      我也是这样,大致代码~:

      this.rdMgr=wx.getRecorderManager();

      Button点击一系列事件:rdMgr.start(_opt);rdMgr.stop();等

      this.rdMgr.onStart(this.wx_onStart);

      this.rdMgr.onPause(this.wx_onPause);

      this.rdMgr.onResume(this.wx_onResume);

      this.rdMgr.onStop(this.wx_onStop);

      然后发现没有调用相关的。。@Link

      2018-05-29
      回复
    • 乔一
      乔一
      2018-05-29

      可以了。把onError()的错误信息打印出来发现是虚拟机上没找到麦克风。。

      2018-05-29
      回复
  • 顺。
    顺。
    2018-05-08

    背景音频原先是可以调节播放速度的,现在这个新的取消了,是否有考虑后期会在加上这个功能呢?

    2018-05-08
    赞同
    回复 3
    • 小程序/小游戏开发-Link
      小程序/小游戏开发-Link
      2018-05-18
      可描述下背景音频需要调节播放速度的需求场景,我们讨论看看。
      2018-05-18
      1
      回复
    • 朝歌
      朝歌
      2018-09-29回复小程序/小游戏开发-Link

      在练习英语相关的场景下是需要音频的倍速的。

      2018-09-29
      回复
    • Yann👓
      Yann👓
      2018-11-21回复小程序/小游戏开发-Link

      可以提供pcm 脉冲数据吗?或则wav也行呀,你这样子的MP3格式的帧片段,还要我们去解码,解码好复杂,有好性能呀,急求

      2018-11-21
      回复

正在加载...

登录 后发表内容