s***@aliyun.com
s***@aliyun.com
  • 发布:2019-04-19 12:00
  • 更新:2021-11-10 11:35
  • 阅读:2135

【报Bug】audioplayer 连续播放14个音频以上会出现播放失败

分类:HTML5+

详细问题描述

[内容]

在华为手机(nova和荣耀7X上测试过),准备超过14个音频,逐个播放,播放到15个的时候,会播放失败,捕获到的异常信息是:{"code":-99,"message":"未知错误"}

目前在iphoneX,iPad,Oppo R9s, 小米等手机上测试过,播放正常
[步骤]

[结果]

[期望]

[如果语言难以表述清晰,拍一个视频或截图,有图有真相]

IDE运行环境说明

[HBuilder 或 HBuilderX。如果你用其他工具开发uni-app,也需要在此说明]

[IDE版本号]

HBuilder版本:1.9.2.20190417

[windows版本号]

[mac版本号]

uni-app运行环境说明

[运行端是h5或app或某个小程序?]

[运行端版本号]

[项目是cli创建的还是HBuilderX创建的?如果是cli创建的,请更新到最新版cli再试]

[编译模式是老模板模式还是新的自定义组件模式?]

App运行环境说明

[Android版本号]

[iOS版本号]

[手机型号]
华为nova和荣耀7X

[模拟器型号]

附件

[IDE问题请提供HBuilderX运行日志。菜单帮助-查看运行日志,点右键打开文件所在目录,将log文件压缩成zip包上传]

[App问题请提供可重现问题的代码片段,你补充的细一点,问题就解决的快一点]

[App安装包或H5地址]

[可重现代码片段]
每次播放得到的播放器JSON,都基本是如下形式:
{"_Player_Param":6,"_Audio_PlayerUUID":"Player841555658871577"}

"_Audio_PlayerUUID"基本都是841555开头的数据,测试了很多次都是这样的。
"_Player_Param"的值一般是3或6

华为的播放记录:
15:25:27.749 播放:0:{"_Player_Param":"/storage/emulated/0/Android/data/io.dcloud.HBuilder/apps/HBuilder/doc/cachefiles/Book2259-3129-001.mp3","_Audio_PlayerUUID":"Player101555658684110"} at js/dr.player.js:49
15:25:32.989 播放:1:{"_Player_Param":"/storage/emulated/0/Android/data/io.dcloud.HBuilder/apps/HBuilder/doc/cachefiles/Book2259-3129-002.mp3","_Audio_PlayerUUID":"Player151555658689350"} at js/dr.player.js:49
15:25:38.193 播放:2:{"_Player_Param":"/storage/emulated/0/Android/data/io.dcloud.HBuilder/apps/HBuilder/doc/cachefiles/Book2259-3129-003.mp3","_Audio_PlayerUUID":"Player201555658694549"} at js/dr.player.js:49
15:25:43.362 播放:3:{"_Player_Param":"/storage/emulated/0/Android/data/io.dcloud.HBuilder/apps/HBuilder/doc/cachefiles/Book2259-3129-004.mp3","_Audio_PlayerUUID":"Player251555658699723"} at js/dr.player.js:49
15:25:49.472 播放:4:{"_Player_Param":"/storage/emulated/0/Android/data/io.dcloud.HBuilder/apps/HBuilder/doc/cachefiles/Book2259-3129-005.mp3","_Audio_PlayerUUID":"Player301555658705827"} at js/dr.player.js:49
15:25:56.175 播放:5:{"_Player_Param":"/storage/emulated/0/Android/data/io.dcloud.HBuilder/apps/HBuilder/doc/cachefiles/Book2259-3129-006.mp3","_Audio_PlayerUUID":"Player351555658712522"} at js/dr.player.js:49
15:26:01.464 播放:6:{"_Player_Param":"/storage/emulated/0/Android/data/io.dcloud.HBuilder/apps/HBuilder/doc/cachefiles/Book2259-3129-007.mp3","_Audio_PlayerUUID":"Player401555658717807"} at js/dr.player.js:49
15:26:06.764 播放:7:{"_Player_Param":"/storage/emulated/0/Android/data/io.dcloud.HBuilder/apps/HBuilder/doc/cachefiles/Book2259-3129-008.mp3","_Audio_PlayerUUID":"Player451555658723118"} at js/dr.player.js:49
15:26:12.046 播放:8:{"_Player_Param":"/storage/emulated/0/Android/data/io.dcloud.HBuilder/apps/HBuilder/doc/cachefiles/Book2259-3129-009.mp3","_Audio_PlayerUUID":"Player501555658728391"} at js/dr.player.js:49
15:26:18.647 播放:9:{"_Player_Param":"/storage/emulated/0/Android/data/io.dcloud.HBuilder/apps/HBuilder/doc/cachefiles/Book2259-3129-010.mp3","_Audio_PlayerUUID":"Player551555658735008"} at js/dr.player.js:49
15:26:23.949 播放:10:{"_Player_Param":"/storage/emulated/0/Android/data/io.dcloud.HBuilder/apps/HBuilder/doc/cachefiles/Book2259-3129-011.mp3","_Audio_PlayerUUID":"Player601555658740308"} at js/dr.player.js:49
15:26:29.209 播放:11:{"_Player_Param":"/storage/emulated/0/Android/data/io.dcloud.HBuilder/apps/HBuilder/doc/cachefiles/Book2259-3129-012.mp3","_Audio_PlayerUUID":"Player651555658745562"} at js/dr.player.js:49
15:26:34.510 播放:12:{"_Player_Param":"/storage/emulated/0/Android/data/io.dcloud.HBuilder/apps/HBuilder/doc/cachefiles/Book2259-3129-013.mp3","_Audio_PlayerUUID":"Player701555658750852"} at js/dr.player.js:49
15:26:39.793 播放:13:{"_Player_Param":"/storage/emulated/0/Android/data/io.dcloud.HBuilder/apps/HBuilder/doc/cachefiles/Book2259-3129-014.mp3","_Audio_PlayerUUID":"Player751555658756127"} at js/dr.player.js:49
15:26:44.964 播放:14:{"_Player_Param":"/storage/emulated/0/Android/data/io.dcloud.HBuilder/apps/HBuilder/doc/cachefiles/Book2259-3129-015.mp3","_Audio_PlayerUUID":"Player801555658761321"} at js/dr.player.js:49
15:26:44.996 播放失败{"code":-99,"message":"未知错误"} at js/dr.player.js:78
15:26:45.030 播放:14:{"_Player_Param":6,"_Audio_PlayerUUID":"Player841555658761382"} at js/dr.player.js:49

iphone的播放记录:

15:40:49.765 [LOG] : 播放:0:{"_Player_Param":"_doc/cachefiles/Book2259-3129-001.mp3","_Audio_PlayerUUID":"Player101555659605307"}
15:40:54.998 [LOG] : 播放:1:{"_Player_Param":"_doc/cachefiles/Book2259-3129-002.mp3","_Audio_PlayerUUID":"Player151555659610631"}
15:41:00.309 [LOG] : 播放:2:{"_Player_Param":"_doc/cachefiles/Book2259-3129-003.mp3","_Audio_PlayerUUID":"Player201555659615794"}
15:41:05.619 [LOG] : 播放:3:{"_Player_Param":"_doc/cachefiles/Book2259-3129-004.mp3","_Audio_PlayerUUID":"Player251555659620960"}
15:41:10.880 [LOG] : 播放:4:{"_Player_Param":"_doc/cachefiles/Book2259-3129-005.mp3","_Audio_PlayerUUID":"Player301555659626943"}
15:41:17.231 [LOG] : 播放:5:{"_Player_Param":"_doc/cachefiles/Book2259-3129-006.mp3","_Audio_PlayerUUID":"Player351555659633532"}
15:41:22.551 [LOG] : 播放:6:{"_Player_Param":"_doc/cachefiles/Book2259-3129-007.mp3","_Audio_PlayerUUID":"Player401555659638662"}
15:41:27.814 [LOG] : 播放:7:{"_Player_Param":"_doc/cachefiles/Book2259-3129-008.mp3","_Audio_PlayerUUID":"Player451555659643854"}
15:41:33.114 [LOG] : 播放:8:{"_Player_Param":"_doc/cachefiles/Book2259-3129-009.mp3","_Audio_PlayerUUID":"Player501555659649004"}
15:41:39.474 [LOG] : 播放:9:{"_Player_Param":"_doc/cachefiles/Book2259-3129-010.mp3","_Audio_PlayerUUID":"Player551555659655463"}
15:41:44.736 [LOG] : 播放:10:{"_Player_Param":"_doc/cachefiles/Book2259-3129-011.mp3","_Audio_PlayerUUID":"Player601555659660636"}
15:41:50.038 [LOG] : 播放:11:{"_Player_Param":"_doc/cachefiles/Book2259-3129-012.mp3","_Audio_PlayerUUID":"Player651555659665780"}
15:41:55.358 [LOG] : 播放:12:{"_Player_Param":"_doc/cachefiles/Book2259-3129-013.mp3","_Audio_PlayerUUID":"Player701555659670974"}
15:42:00.612 [LOG] : 播放:13:{"_Player_Param":"_doc/cachefiles/Book2259-3129-014.mp3","_Audio_PlayerUUID":"Player751555659676121"}
15:42:05.913 [LOG] : 播放:14:{"_Player_Param":"_doc/cachefiles/Book2259-3129-015.mp3","_Audio_PlayerUUID":"Player801555659681314"}
15:42:16.475 [LOG] : 播放:15:{"_Player_Param":"_doc/cachefiles/Book2259-3129-016.mp3","_Audio_PlayerUUID":"Player851555659692038"}
15:42:23.915 [LOG] : 播放:16:{"_Player_Param":"_doc/cachefiles/Book2259-3129-017.mp3","_Audio_PlayerUUID":"Player901555659699389"}

联系方式

[QQ]349751372

2019-04-19 12:00 负责人:DCloud_Android_ST 分享
已邀请:
DCloud_Android_zl

DCloud_Android_zl

麻烦提供一个简单的demo吧

s***@aliyun.com

s***@aliyun.com (作者)

下面是用来播放的代码:基本逻辑是播放器初始化时会接收到一个数组pages,里面存放一组页面的图片和音频,playAudio时用来播放指定页面(由playIndex确定)的音频,首先会将音频文件缓存到本地,然后播放,播放完成后播放下一页的音频,直到所有页面都播放完成。 我报的这个问题不仅在华为手机上存在,后来我在oppo,小米手机上反复测试发现也同样存在这样的问题,只是他们出错的页数会更多,达到27页之后才会报错。

playAudio: function(callback) {

   clearTimeout(dr.bookPlayer.audioTimer );  

if (this.aPlayer && this.playIndex <= 0)  
    this.aPlayer.stop();  

var page = this.pages[dr.bookPlayer.playIndex];  

this.playingUrl = page.PageAudio;  
//缓存音频文件到本地  
dr.files.getCacheFile(page.AudioUrl, function(f) {  

    dr.bookPlayer.stop();  
    dr.bookPlayer.aplayer = plus.audio.createPlayer(f);  
    dr.bookPlayer.duration = null;  
    dr.bookPlayer.aplayer.play(function(e) {  
        //播放完进行翻页,自动播放下一页  
        var pageInterval = Math.max(0, 5 - dr.bookPlayer.duration);  
        dr.bookPlayer.audioTimer = window.setTimeout(playNextAudio, pageInterval * 1000);  
    }, function(e) {  
        mui.toast("播放失败:" + e.message);  
    });  
});  

function playNextAudio() {  
    if (dr.bookPlayer.playIndex < dr.bookPlayer.pages.length - 1) {  
        dr.bookPlayer.playIndex++;  
        dr.bookPlayer.playAudio(callback);  
        dr.bookPlayer.playStatus = "播放中";  
    } else {  
        //多音频时,所有页面都播放完成  
        dr.bookPlayer.playStatus = "播放完";  

        callback && callback();  
    }  
}  

},

  • s***@aliyun.com (作者)

    上面提供的这段代码就是我们出问题的demo代码

    2019-04-27 21:22

s***@aliyun.com

s***@aliyun.com (作者)

还有一个情况。
我们判断这个问题的原因是在同一个页面反复创建播放器对象,而stop()方法又不能有效释放该对象,导致页面崩溃。

由于项目紧急,所以我们采用了另外一种方式来规避这个问题,即将创建播放器对象的方法改为播放器对象存在就更改播放音频文件路径:

将 dr.bookPlayer.aplayer = plus.audio.createPlayer(f);
改为:
if (dr.bookPlayer.aplayer == null)
dr.bookPlayer.aplayer = plus.audio.createPlayer(f);
else {
var option = dr.bookPlayer.aplayer.getStyles();
option.backgroundControl = true;
option.src = f;
option.autoplay = true;
dr.bookPlayer.aplayer.setStyles(option);
}
dr.bookPlayer.aplayer.play(function(e) { });

这个方法确实有效解决了不能连续播放多页的问题,至少我们已经测试一周,在同一页至少反复播放过50次不会出现播放错误的情况。

但是随之而来的一个问题又非常的诡异:
这种做法只能用大版本更新,如果用资源包的形式更新只能播放第1页,第2页就就会出错无法继续播放,我们在测试的时候就发现这样的问题,所以采用大版本的方式发布修复了图书播放的问题。

今天我们又更新了一个资源包,用于更新一个其他问题,但是无法播放的问题又在部分机型上出现了。也就是说,这个版本关于音频播放逻辑部分的代码与上一个大版本的代码是完全一致的。但是大版本用户更新了是可以正常播放图书音频,而再更新这个资源包之后,又变得不能播放了。

有的安卓手机报.l的错误是:java.lang.illgalStateException,见附件视频。

  • DCloud_Android_zl

    麻烦提供一个简单的demo,最好带有资源包更新的功能,我这边复现解决一下。

    2019-04-26 17:46

  • s***@aliyun.com (作者)

    回复 DCloud_Android_zl: 是要把源码全部发给你吗?语音播放的核心代码就是上面给你的这些

    2019-04-26 17:58

  • DCloud_Android_zl

    回复 s***@aliyun.com: 不用全部代码,弄出个例子就可以,可以复现就行

    2019-04-26 18:00

  • s***@aliyun.com (作者)

    回复 DCloud_Android_zl: 2楼回复的那端脚本就是demo,用它在安卓机器上连续播放就会出错误,错误代码-99

    2019-04-27 21:23

  • DCloud_Android_zl

    回复 s***@aliyun.com: 建议推荐通过setstyle来切换src,频繁创建确实会消耗内存,-99也是系统通知的异常,安卓报illgalStateException的时候,完整的报错提供一下,我们这边需要排查一遍,还有最好是提供一份小demo。

    2019-04-29 13:47

  • s***@aliyun.com (作者)

    回复 DCloud_Android_zl: 我感觉不知道怎么给你提供demo,核心代码我已经贴出来给你了,除非我再单独写一个能重现这个问题的app。 现在又出现一个超级严重的bug了,而且在你们的官方demo中也能重现,请务必现排出解决:http://ask.dcloud.net.cn/question/70029

    2019-04-29 23:00

  • s***@aliyun.com (作者)

    回复 DCloud_Android_zl: Ios 创建音频播放器播放后,再调用mui.back(), 会成功闪退,这个问题在一周之前打包的版本上是没有的,今天突然发现,我们用你们官方的h5+ 项目实例测试,也成功重现了该问题。

    2019-04-29 23:03

  • DCloud_Android_zl

    回复 s***@aliyun.com: ios的对吗?我反馈给同事。

    2019-04-30 10:45

  • h***@163.com

    原来每次进入都用plus.audio.createPlayer(),累计播放十几、二十几次就卡死,如果音频文件长一点,卡死的速度更快,按照这个方法试了一下,非常好用,重复播放了几十次都没卡死,爆赞!!!

    2023-08-29 10:24

w***@foxmail.com

w***@foxmail.com

uniApp开发中存在相同问题,持续关注中,求解决

就不告诉你

就不告诉你

遇到同样的问题,请问怎么解决的,扫码成功后播放提示音,在十几次之后 无法播放声音

rainbow57

rainbow57 - 向大前端进发的攻城狮

我这边也碰到了这个问题,同一个音频(本地)不停的点击,十多次之后会出现-99 未知错误,然后就播放所有音频都会出现这个错了。

另外用getStyles 和 setStyles 方法无效。
用getStyles方法拿到的是undefined, 使用setStyles({src: '/media/3.mp3'}) 这样设置过之后,再调用一次 getStyles()函数,得到的还是undefined

WUSHENGFENG77

WUSHENGFENG77

请问解决了吗

WUSHENGFENG77

WUSHENGFENG77

我也遇到了这个问题:
同一个音频不停的点击,(一加8手机)每次都是40次之后会出现-99 未知错误,然后就播放所有音频都会出现这个错了。
var p = new plus.audio.createPlayer("audio/OK.wav");
p.play(function() {
setTimeout(function() {
p.stop();
}, 100);
}, function(e) {
alert("异常: " + JSON.stringify(e));
})

  • s***@aliyun.com (作者)

    每次播放前把player停掉,并释放,然后再重新创建播放器对象

    2021-12-23 12:23

该问题目前已经被锁定, 无法添加新回复