收藏
回答

InnerAudioContext音频播放bug

框架类型 问题类型 API/组件名称 终端类型 微信版本 基础库版本
小游戏 Bug InnerAudioContext 客户端 7.0.3 Wechat Lib:2.6.1,2019.2.21 16:15:02

- 当前 Bug 的表现(可附上截图)

进行远程的mp3音频播放的时候,发现开发工具上表现正常,但是真机(测试机子为小米Note3)却不正常(通过开发者工具的预览功能调试)。

测试的音频为一个按钮的点击音效。


以下是开发者工具的控制台输出截图:
一次playCount对应一次canPlayCount,声音能在执行play()接口的时候马上播放。


以下是真机(小米Note3)的控制台输出截图(通过开发者工具的预览功能调试)


表现的效果为,playCount和canPlayCount次数并没有对上,调用play()的时候,声音并没有马上出来,而且,每次onWaiting有收到信息的时候,查看静态服务器后台输出,发现还会再次进行资源的请求。但每次都是用同一个innerAudioContext对象进行播放,按理来说,不应该重复加载资源才对。服务端输出内容如下:



- 预期表现

资源加载成功之后,应该是调用了play()接口,就要马上有声音出来才对,而且不应该每次play都重复进行远程资源的加载。


- 复现路径


- 提供一个最简复现 Demo



function testAudio(url, obj){
obj.canPlayCount = 0;
   obj.playCount = 0;
   var flag = false;
   var innerAudioContext = wx.createInnerAudioContext();
   var startPlay = function(){
if(flag) return;
       flag = true;
       window.setInterval(function(){
console.log("playCount---->", ++obj.playCount, "  ", mo.DATE.format(mo.DATE.date()));
           innerAudioContext.play();
       }, 5000);

   };
   // var startPlay2 = function(){
   //     console.log("playCount---->", ++obj.playCount, "  ", mo.DATE.format(mo.DATE.date()));
   //     innerAudioContext.play();
   // };
   innerAudioContext.onCanplay(function () {
console.log("canPlayCount---->", ++obj.canPlayCount, "  ", mo.DATE.format(mo.DATE.date()));
       startPlay();
   });
   innerAudioContext.onWaiting(function() {
console.log('onWaiting---->', obj.playCount);

   });
   innerAudioContext.onEnded(function (e) {
console.log("onEnded")

});
   innerAudioContext.src = url;
}


调用:



testAudio(url, {});

url为一个远程的mp3地址。

回答关注问题邀请回答
收藏

3 个回答

  • 蓝萨节
    蓝萨节
    2020-02-02

    小程序新手感觉,这个innerAudioContext bug好多啊。完全不如普通网页好用

    2020-02-02
    有用 1
    回复
  • 李大壮就酱
    李大壮就酱
    12-02

    多年前从业小程序外包快速开发,深受其害。

    万没想到多年以后,又被小程序继续折磨,当年就是一坨,现在还是一坨 更大的一坨。

    12-02
    有用
    回复
  • 一念成忧凉
    一念成忧凉
    2019-03-04

    你这个 flag什么时候重置为false呢?然后你的5秒的定时器作用意义是什么?

    2019-03-04
    有用
    回复 3
    • 阿噂啊
      阿噂啊
      2019-03-06

      flag是为了确保startPlay只在加载完毕之后,里面的内容只执行一次。 5秒的定时器,就是每隔5秒播放一次啊,然后看到的表现就是声音的播放时机不正确,日志的输出也跟预想的不一样。

      2019-03-06
      回复
    • 一念成忧凉
      一念成忧凉
      2019-03-10回复阿噂啊

      那你testAudio调用后岂不是这个音效会无限的5秒播放?我认为还是你这个定时器设置的问题。建议把定时器放到外面,不要在testAudio里面实现可以  testAudio 里return 出innerAudioContext对象



      2019-03-10
      回复
    • 阿噂啊
      阿噂啊
      2019-03-28回复一念成忧凉

      我就是要无线的5秒播放一次啊,但是播放出来的效果不正常,并没有5秒播放出来一次。 你看下我输出的日志,效果并不是没5秒一次,真机跟开发者工具是有很大区别。

      2019-03-28
      回复
登录 后发表内容