onmyway911
onmyway911
  • 发布:2019-06-19 23:14
  • 更新:2023-05-19 10:33
  • 阅读:11040

uni.createInnerAudioContext播放mp3,反复播放10来次,就不再有声音了

分类:uni-app

不知道为什么,有遇到这个问题的朋友吗?

var muzic = uni.createInnerAudioContext();
muzic.volume = 1;
muzic.obeyMuteSwitch =false;
muzic.src = "/static/radio/electric.mp3";
muzic.seek(3);
muzic.play();
setTimeout(function() {
muzic.destroy();
}, 300)

2019-06-19 23:14 负责人:DCloud_Android_zl 分享
已邀请:
4***@qq.com

4***@qq.com

问题解决了,经测试,下面的代码可以解决问题。希望大家的问题也能得到解决。

let src = '../../static/voice/'+ v +'.mp3';  
            //实例化声音  
            const Audio = uni.createInnerAudioContext();  
                  Audio.autoplay=true;  
                  Audio.src = src;//音频地址  
                  Audio.onError((res) => {  
                    console.log(res.errMsg);  
                    console.log(res.errCode);  
                      Audio.destroy();//发生错误后,销毁实例  
                  });  
                  Audio.onPause(function() {      
                      console.log('end');      
                      Audio.destroy();//这里是播放暂停后,销毁实例  
                  });  
                  Audio.onStop(function() {      
                      console.log('stop');      
                      Audio.destroy();//这里是播放停止后,销毁实例  
                  });  
                  Audio.onEnded(function() {      
                      console.log('ended');      
                      Audio.destroy();//这里是播放结束后,销毁实例  
                  });
DCloud_UNI_GSQ

DCloud_UNI_GSQ

哪端?

  • onmyway911 (作者)

    app 安卓

    2019-06-22 00:58

  • onmyway911 (作者)

    已经查出原因了,多次实例化的原因,虽然每次都destroy或=null了,但其实应该没有真正释放

    2019-07-03 12:01

  • DCloud_UNI_GSQ

    回复 onmyway911: 你使用的是自定义组件编译模式?还是旧的编译模式?

    2019-07-03 17:21

  • onmyway911 (作者)

    回复 DCloud_UNI_GSQ:

    let music = uni.createInnerAudioContext();

    2019-07-03 20:12

  • DCloud_UNI_GSQ

    回复 onmyway911: 请问你使用的那种编译模式(在运行的时候会输出)

    2019-07-03 20:44

  • onmyway911 (作者)

    回复 DCloud_UNI_GSQ: uni-app自定义组件编译

    2019-07-03 21:20

  • DCloud_UNI_GSQ

    回复 onmyway911: 使用的HBuilderX版本多少?

    2019-07-04 10:39

  • onmyway911 (作者)

    回复 DCloud_UNI_GSQ: 最新的HBuilder X 2.0.1.20190614

    2019-07-04 12:55

  • DCloud_UNI_GSQ

    回复 onmyway911: 你确认是自定义组件编译模式吗?manifest里app-plus节点下usingComponents值为true

    2019-07-04 18:00

  • onmyway911 (作者)

    回复 DCloud_UNI_GSQ: manifest.json>

    app常用其它设置>编译模式>checkbox自定义组件模式选中


    但是在源码模式下没有找到usingComponents值

    2019-07-04 20:03

  • DCloud_UNI_GSQ

    回复 onmyway911: 编译的时候是否输出的日志显示是否是自定义组件编译模式?

    2019-07-05 10:48

  • onmyway911 (作者)

    回复 DCloud_UNI_GSQ: 是的,每次自定义基座真机运行,都提示是自定义组件模式

    2019-07-06 23:50

  • DCloud_UNI_GSQ

    回复 onmyway911: 你换个设备试试,看是否仍然存在这个问题

    2019-07-08 10:46

  • onmyway911 (作者)

    回复 DCloud_UNI_GSQ: 我在网上看到过其他人对于微信小程序audio的问题说明,基本上是一样的问题:

    https://segmentfault.com/a/1190000014469604

    2019-07-08 23:58

  • Liew

    回复 DCloud_UNI_GSQ: 已经 "usingComponents" : true,只实例化一次,只播放一次声音,后面就播放不了(没声音)也没报错

    2019-10-24 17:46

  • 1***@qq.com

    回复 Liew: 遇到同样的问题了,只能播放一次,请问您解决了吗

    2020-03-06 20:26

jacolie

jacolie

怎么解决的?我也碰到了,谢谢

tglk1688

tglk1688

我也遇到了,循环播放报错-99 media error

自定义组件编译模式

每次循环会实例化,播放完后我也会destroy,但是多次后仍然会报那个错

如果在onLoad 只实例化一次的话,那么循环就会变成第一次读第一个音频,第二次读第二个音频,第三次读第五个音频。

  • 1***@qq.com

    我跟你遇到了同样的问题, 请问一下,解决了吗

    2019-09-23 16:51

  • 我是大神的弟子

    请问,怎么解决的?

    2019-11-27 16:02

  • 90后菜鸟

    你好 请问这个问题解决了吗

    2020-03-20 14:36

三生石下花

三生石下花

同上 多次播放后音频失效 重新创建播放也没声音

我是大神的弟子

我是大神的弟子 - 我不是大神啊

同上 多次播放后音频失效 重新创建播放也没声音

JerrySirCom

JerrySirCom

@DCloud_UNI_GSQ 请问一下,这个问题解决了吗?能提供一下解决思路么?我们做的是语音听单系统,用着用着就闪退、无音,客户反馈很差,在线等解决方案

  • DCloud_UNI_GSQ

    有什么规律吗?

    2020-01-13 11:02

  • JerrySirCom

    回复 DCloud_UNI_GSQ: 你可以把官网的示例封个函数,多执行几次,就会出现这种问题,就是一直创建——播放——停止——销毁,再创建——播放——停止——销毁,一定次数之后开始报错、闪退

    2020-01-13 11:20

  • JerrySirCom

    回复 DCloud_UNI_GSQ: https://ask.dcloud.net.cn/question/79350,https://ask.dcloud.net.cn/question/1583,你看好多类似的这种问题,很严重,随便搜一下createInnerAudioContext关键词就能搜到多次播放错误的问题

    2020-01-13 11:23

  • JerrySirCom

    回复 DCloud_UNI_GSQ: 刚才调试报了个错,时不时的就会报这种错误,不知道对你有没有帮助:

    10:44:50.716 [JS Framework] Failed to execute the callback function:

    10:44:50.738 TypeError: undefined is not an object (evaluating 'i[t===o[0]&&i.isPaused?"resume":t]')

    10:44:50.993 reportJSException >>>> exception function:callJS, exception:JavaScript execute error!Exception: TypeError: undefined is not an object (evaluating 'i[t===o[0]&&i.isPaused?"resume":t]')

    10:44:51.015 operateAudio@weex createInstanceContext:3:53081

    10:44:51.035 invokeHandler@weex createInstanceContext:3:87999

    10:44:51.056 weex createInstanceContext:4:1471

    10:44:51.079 invoke@weex createInstanceContext:4:1516

    10:44:51.100 invoke@weex createInstanceContext:4:105145

    10:44:51.124 X@weex createInstanceContext:4:162855

    10:44:51.148 weex createInstanceContext:4:170308

    10:44:51.169 gc@weex createInstanceContext:4:311501

    10:44:51.191 weex createInstanceContext:4:314358

    10:44:51.211 (weex framework):1:202118

    10:44:51.234 consume@(weex framework):1:1383

    10:44:51.254 map@[native code]

    10:44:51.298 getTemplateInfo== template md5 dace2c736ef985312fbbbf5d309b4e4 length 3157430 base64 md5 DazixzbvmFMS+7v10wm05A== response header {"templateSourceBase64MD5":["DazixzbvmFMS+7v10wm05A=="],"templateSourceMD5":["dace2c736ef985312fbbbf5d309b4e4"]}

    2020-01-13 11:24

  • 曾哥

    回复 JerrySirCom: 对,没错是有这种情况,createInnerAudioContext多次播放在安卓下会突然停止,在app端我使用了plus.audio.createPlayer 这次在安卓下播放数十次后会闪退。苹果目前没有问题

    2020-01-13 18:44

JerrySirCom

JerrySirCom

export default {  
        data() {  
            return {  
                title: 'Hello'  
            }  
        },  
        onLoad() {  
            this.audioPlay();  
        },  
        methods: {  
            audioPlay() {  
                const innerAudioContext = uni.createInnerAudioContext();  
                innerAudioContext.autoplay = true;  
                innerAudioContext.src = 'https://ltech-hongqi.oss-cn-zhangjiakou.aliyuncs.com/dong.mp3';  
                innerAudioContext.onPlay(() => {  
                  console.log('开始播放');  
                });  
                innerAudioContext.onError((res) => {  
                  console.log(res.errMsg);  
                  console.log(res.errCode);  
                });  
                innerAudioContext.onEnded(function(){  
                    this.audioPlay();  
                }.bind(this))  
            }  
        }  
    }

输出
15:24:53.877 应用【audioTest】已启动...
15:25:00.951 App Launch at App.vue:4
15:25:00.971 App Show at App.vue:7
15:25:01.041 App Show at App.vue:7
15:25:01.535 开始播放 at pages/index/index.vue:26
15:25:02.756 开始播放 at pages/index/index.vue:26
15:25:03.907 开始播放 at pages/index/index.vue:26
15:25:06.030 开始播放 at pages/index/index.vue:26
15:25:07.194 开始播放 at pages/index/index.vue:26
15:25:08.359 开始播放 at pages/index/index.vue:26
15:25:09.574 开始播放 at pages/index/index.vue:26
15:25:10.797 开始播放 at pages/index/index.vue:26
15:25:11.993 开始播放 at pages/index/index.vue:26
15:25:13.153 开始播放 at pages/index/index.vue:26
15:25:14.347 开始播放 at pages/index/index.vue:26
15:25:15.554 开始播放 at pages/index/index.vue:26
15:25:16.720 开始播放 at pages/index/index.vue:26
15:25:18.204 开始播放 at pages/index/index.vue:26
15:25:19.388 开始播放 at pages/index/index.vue:26
15:25:20.576 开始播放 at pages/index/index.vue:26
15:25:21.803 开始播放 at pages/index/index.vue:26
15:25:22.956 开始播放 at pages/index/index.vue:26
15:25:24.100 开始播放 at pages/index/index.vue:26
15:25:25.241 开始播放 at pages/index/index.vue:26
15:25:26.355 开始播放 at pages/index/index.vue:26
15:25:27.569 开始播放 at pages/index/index.vue:26
15:25:28.973 开始播放 at pages/index/index.vue:26
15:25:30.163 开始播放 at pages/index/index.vue:26
15:25:31.320 开始播放 at pages/index/index.vue:26
15:25:32.506 开始播放 at pages/index/index.vue:26
15:25:33.948 开始播放 at pages/index/index.vue:26
15:25:35.115 开始播放 at pages/index/index.vue:26
15:25:36.334 开始播放 at pages/index/index.vue:26
15:25:37.526 开始播放 at pages/index/index.vue:26
15:25:38.692 开始播放 at pages/index/index.vue:26
15:25:39.906 开始播放 at pages/index/index.vue:26
15:25:41.112 开始播放 at pages/index/index.vue:26
15:25:42.318 开始播放 at pages/index/index.vue:26
15:25:43.764 开始播放 at pages/index/index.vue:26
15:25:44.950 开始播放 at pages/index/index.vue:26
15:25:46.163 开始播放 at pages/index/index.vue:26
15:25:47.369 开始播放 at pages/index/index.vue:26
15:25:48.555 开始播放 at pages/index/index.vue:26
15:25:49.708 开始播放 at pages/index/index.vue:26
15:25:50.909 开始播放 at pages/index/index.vue:26
15:25:50.956 MediaError at pages/index/index.vue:29
15:25:50.978 [Number] -99 at pages/index/index.vue:30

JerrySirCom

JerrySirCom

加了停止和销毁之后,APP直接闪退

JerrySirCom

JerrySirCom

打开Logcat抓了一堆日志

2020-01-14 15:33:02.708 30547-30562/? E/AndroidRuntime: FATAL EXCEPTION: WeexJSBridgeThread  
    Process: io.dcloud.HBuilder, PID: 30547  
    java.lang.IllegalStateException  
        at android.media.MediaPlayer._pause(Native Method)  
        at android.media.MediaPlayer.pause(MediaPlayer.java:1440)  
        at io.dcloud.feature.audio.AudioPlayer.pause(AudioPlayer.java:329)  
        at io.dcloud.feature.audio.AudioPlayer$1.onAudioFocusChange(AudioPlayer.java:74)  
        at android.media.AudioManager$ServiceEventHandlerDelegate$1.handleMessage(AudioManager.java:2336)  
        at android.os.Handler.dispatchMessage(Handler.java:106)  
        at android.os.Looper.loop(Looper.java:201)  
        at android.os.HandlerThread.run(HandlerThread.java:65)
  • DCloud_Android_zl

    安卓的音频不能无限制创建且不回收,可以通过切换src实现播放不同的音乐。

    2020-01-14 17:19

  • DCloud_Android_zl

    闪退问题将会在下版修复,修复之后可以在重复创建之前将上一个清除掉。

    2020-01-14 17:19

  • JerrySirCom

    回复 DCloud_Android_zl: 嗯,我尝试过切换src,但是始终是需要释放资源的,释放两次就会闪退依然解决不了这个问题呀

    2020-01-14 17:27

  • JerrySirCom

    回复 DCloud_Android_zl: 还有,会在alpha版本修复这个问题吗?我打算先给用户打个包去用,不然修复版本发布周期太长,客户那边受不了

    2020-01-14 17:29

  • JerrySirCom

    回复 DCloud_Android_zl: 切换src有个逻辑问题,提示音的音乐文件就是同一个,不能用切换src实现重播呀

    2020-01-17 13:45

  • DCloud_Android_zl

    回复 JerrySirCom: 新版本已经上线。

    2020-01-17 14:49

1***@qq.com

1***@qq.com - 开发者

我是2.6.1版本 在Android手机上通过切换src 只能播放一次,在播放别的就没声音了。
ios上没这个问题。在线等解决方案

90后菜鸟

90后菜鸟 - 90后

多次之后直接 -99
HBuilder X 2.6.5 Android


function playAudio(url) {  
    const innerAudioContext = uni.createInnerAudioContext();  
    innerAudioContext.autoplay = true;  
    innerAudioContext.src = url;  
    innerAudioContext.onPlay(() => {  
      console.log("Audio play success!");  
    });  
    innerAudioContext.onError((res) => {  
      // console.log(res.errMsg);  
      console.log(res.errCode);  
      console.log("Audio play failed: " + res.errMsg);  
    });  
}  

14:37:30.975 Audio play success! at common\helper.js:9  
14:37:32.060 Audio play success! at common\helper.js:9  
14:37:32.840 Audio play success! at common\helper.js:9  
14:37:33.659 Audio play success! at common\helper.js:9  
14:37:34.436 Audio play success! at common\helper.js:9  
14:37:35.294 Audio play success! at common\helper.js:9  
14:37:36.195 Audio play success! at common\helper.js:9  
14:37:37.178 Audio play success! at common\helper.js:9  
14:37:38.233 Audio play success! at common\helper.js:9  
14:37:39.733 Audio play success! at common\helper.js:9  
14:37:40.679 Audio play success! at common\helper.js:9  
14:37:41.652 Audio play success! at common\helper.js:9  
14:37:42.775 Audio play success! at common\helper.js:9  
14:37:43.536 Audio play success! at common\helper.js:9  
14:37:44.254 Audio play success! at common\helper.js:9  
14:37:44.275 [Number] -99  at common\helper.js:13  
14:37:44.296 Audio play failed: MediaError at common\helper.js:14
4***@qq.com

4***@qq.com

共用src,H5浏览器正常,打包APK后,只能点一次。放进去,打包后,播个十来次后就会出现部分声音播不出来,到后面全部播放不了。

  • 4***@qq.com

    我也遇到了这个问题,请问解决了吗?怎么解决的呢?

    2024-04-01 13:56

Javin

Javin

这个uni.createInnerAudioContext都多久了还没解决
https://ask.dcloud.net.cn/question/91695
我报的这个也没人理会客户都想把我撕碎了

  • 4***@qq.com

    var innerAudioContext = uni.createInnerAudioContext(); //创建播放器对象

    innerAudioContext.autoplay=true

    function PlayVoice(src) {

    console.log('播放路径:'+url.url.titleurl+src)

    innerAudioContext.src = url.url.titleurl+src; //选择播放的音频

    innerAudioContext.play(); //执行播放

    }

    2020-04-06 16:31

  • 4***@qq.com

    这个可以

    2020-04-06 16:31

  • DCloud_UNI_GSQ

    来了

    2020-04-07 11:04

  • 4***@qq.com

    我的问题解决了,尝试下面的代码?


    let src = '../../static/voice/'+ v +'.mp3';

    //实例化声音

    const Audio = uni.createInnerAudioContext();

    Audio.autoplay=true;

    Audio.src = src;//音频地址

    Audio.onError((res) => {

    console.log(res.errMsg);

    console.log(res.errCode);

    Audio.destroy();//发生错误后,销毁实例

    });

    Audio.onPause(function() {

    console.log('end');

    Audio.destroy();//这里是播放暂停后,销毁实例

    });

    Audio.onStop(function() {

    console.log('stop');

    Audio.destroy();//这里是播放停止后,销毁实例

    });

    Audio.onEnded(function() {

    console.log('ended');

    Audio.destroy();//这里是播放结束后,销毁实例

    });

    2020-04-16 12:26

4***@qq.com

4***@qq.com

我也遇到类似问题,ANDROID,真机
我做的是一个计算器
就是按数字1,2,3,4,5,会发出模拟 1,2,3,4,5 这样的读音的

按着按着,后面就发不出声音了,代码大概如下

voice(v){  
            let src = '../../static/voice/'+ v +'.mp3';  
            //实例化声音  
            const innerAudioContext = uni.createInnerAudioContext();  
                  innerAudioContext.src = src;//音频地址  
                  innerAudioContext.play();  
                  innerAudioContext.onError((res) => {  
                    console.log(res.errMsg);  
                    console.log(res.errCode);  
                  });  
}

如果实例化是放在全局,那么,播放的声音是延时,也不对啊!

HX版本:2.6.13,ANDROID真机
也是报错 Mediaerror -99

  • DCloud_UNI_GSQ

    播放结束后调用 destroy 试试

    2020-04-16 12:04

  • 4***@qq.com

    回复 DCloud_UNI_GSQ: 问题解决了,谢谢,播放暂停或者结束后,销毁实例就可以了


                  Audio.onEnded(function() {      
    console.log('ended');
    Audio.destroy();
    });

    2020-04-16 12:22

不知布知

不知布知

Audio.src ='URL?fileName='+s
Audio.onPlay(() => {
console.log('开始播放')
})
Audio.onError((res) => {
console.log(res.errMsg)
console.log(res)
Audio.destroy()
})

还是一样 多播放几次 就出现-99

不知布知

不知布知

你好,请问解决了吗?我现在也是一直报这个错

7***@qq.com

7***@qq.com

语音组件实例化不要多次创建,播放语音只需要innerAudioContext.src和innerAudioContext.play()。如果用innerAudioContext.onPlay()会导致叠

EJRUN以界

EJRUN以界

目前仍存在的问题,在 app 模式,ios、android 都一样。

一次播放一个文件,通过切换 src 后 调用 play 播放。连续播放 本地的 小mp3文件 200 个以上后 ,播放速度会慢慢来越慢,直至没有声音。MP3文件 每个 都不超过 10k,时长1 秒左右。

开始时正常,每秒播放一个。到后来 play 调用后,要等很久才会有声音。

我们调用 play 前,通过 onended 监听 改变 临时变量的值,确保 上一个播放完后,再播放下一个。

估计 底层开发者没有做过 连续 大量播放 小 音频文件的测试。

目前的解决方案是,播发 几十个文件后,destory 掉innerAudioContext ,重新创建一个。

另外,微信小程序 的 wx.createInnerAudioContext ,在 pc 模式下,播放一个文件后,再播放就没有声音了。只能播放一次后,销毁对象,重新createInnerAudioContext。

7***@qq.com

7***@qq.com

问题根本原因是实例不能创建多次,在全局定义一次实例多次调用就行

  • 无情搬砖码农

    这样子全局定义一下多次调用 还是会卡死,而且有个问题就是如果你你销毁掉,再次进入页面是没有了音频上下文对象的

    2024-05-06 18:32

要回复问题请先登录注册