在ipad pro上高速频繁使用createInnerAudioCo播放短声音,必然会导致微信闪退!
因为业务需要,用户操作需要触发很密集但无规律的短声音播放(没法用固定循环播放),用下面的代码,在3分钟以内,有接近100%概率能让ipad pro(ios 14.6)上的微信闪退。闪退发生的时间不确定,有时运行4秒就闪退,有时30秒闪退,有时2分多钟后闪退。而同样的测试代码片段运行在iphone 7p手机、android手机上,即使运行2小时也不会闪退。 1、修改useWebAudioImplement: false 后不会闪退,但声音会有很大的咔哒杂音,无法用。(官方文档说设置true会占用更大的内存) 2、并发声音播放数 Contex_Number 试过 4、8、16、32 ,对闪退规律影响不大。小于3时,长时间运行也是会闪退,但是声音密集度不足,满足不了需求。 3、即使先stop()再play(),也是会闪退。 4、缩短声音长度到1秒内,采样率降低到16000sps,也没能缓解闪退问题 5、下面的定时器100ms是业务上需要到的,把定时调到1000ms,也是会闪退的,只是需要等时间久一些。怀疑是内存泄漏。 请问是否有办法解决这个问题,是否有别的途径实现我这个需求,希望能指导,谢谢! 测试代码如下(与代码片段里的一致),大概思路是初始化时一次性创建8个声音contex,在需要播放时调出“空闲”的contex播放,以达到无规律密集重叠播放的效果。 var audio_contex_list = [];
var Contex_Number = 8;
var current_idx = 0;
var timer_contex = null;
Page({
onLoad(options) {
play_audio_file_init()
},
onShow() {
Loop();
},
onHide(){
clearTimeout(timer_contex);
}
})
function Loop(){
timer_contex = setTimeout(Loop,100);
play_shoot_audio_file();
}
function play_audio_file_init() {
for (let idx = 0; idx < Contex_Number; idx++) {
let contex = wx.createInnerAudioContext({
useWebAudioImplement: true
})
contex.autoplay = false;
contex.src = '/sound/mix_2.wav';
audio_contex_list.push(contex);
}
}
function play_shoot_audio_file() {
if (current_idx >= Contex_Number) {
current_idx = 0;
}
let contex = audio_contex_list[current_idx];
contex.play();
current_idx++;
};
https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/wx.createInnerAudioContext.html