uni-app IOS平台下,plus.audio.createPlayer的addEventListener监听事件执行混乱,多个音源播放end play只执行一次
uni-app IOS平台下,plus.audio.createPlayer的addEventListener监听事件执行混乱,多个音源播放end play只执行一次
产品分类
uniapp/App
开发环境信息
项目 | 信息 |
---|---|
PC开发环境操作系统 | Windows |
PC开发环境操作系统版本号 | 11 |
HBuilderX类型 | 正式 |
HBuilderX版本号 | 4.28 |
手机系统 | iOS |
手机系统版本号 | iOS 15 |
手机厂商 | 苹果 |
手机机型 | iPhone 6s |
页面类型 | Vue |
Vue版本 | Vue 3 |
打包方式 | 离线 |
项目创建方式 | HBuilderX |
示例代码
let sound = plus.audio.createPlayer(utils.getFileUrl(msg.jsonData as string))
sound.setSessionCategory('ambient')
sound.addEventListener('ended', (result) => {
console.log('end play >>>>', msg.jsonData as string, result)
if (msg.userId !== currentMember.userId) {
data.memberList.forEach((member) => {
if (msg.userId === member.userId) {
member.speaking = false // 别人停止发言
}
})
}
sound = null
})
sound.addEventListener('play', (result) => {
console.log('start play >>>>', result)
})
sound.play()
console.log('start play >>>>', msg.jsonData as string)
操作步骤
使用plus.audio.createPlayer
创建的多个播放音源,监听ended
事件只有第一个执行。监听play
事件会出现更多次调用,感觉添加监听这里很混乱。
预期结果
2个声音同时播放,监听的ended
和play
事件应该执行2次。
实际结果
2个声音同时播放,监听的ended
只执行了一次,play
事件执行了3次。
Bug描述
使用plus.audio.createPlayer
创建的多个播放音源,监听ended
事件只有第一个执行。监听play
事件会出现更多次调用,感觉添加监听这里很混乱。
plus.audio.createPlayer的addEventListener监听事件执行混乱,多个音源播放end play只执行一次(只执行第一个的监听)
预期结果:2个声音同时播放,监听的ended和play事件应该执行2次
实际结果:2个声音同时播放,监听的ended只执行了一次,play事件执行了3次
主要问题:end play在同时播放音源时,希望音源播放多少就执行多少次
更多关于uni-app IOS平台下,plus.audio.createPlayer的addEventListener监听事件执行混乱,多个音源播放end play只执行一次的实战教程也可以访问 https://www.itying.com/category-93-b0.html
BUG还是BUG,换了方案,采用定时监听播放器状态可以解决就是时效性不行
更多关于uni-app IOS平台下,plus.audio.createPlayer的addEventListener监听事件执行混乱,多个音源播放end play只执行一次的实战教程也可以访问 https://www.itying.com/category-93-b0.html
什么时候能解决啊
在uni-app中,如果你在IOS平台上使用plus.audio.createPlayer
时遇到事件监听执行混乱的问题,特别是多个音频播放时end
事件只触发一次,这通常是因为事件绑定或管理不当导致的。以下是一个简化的代码示例,展示如何正确管理多个音频播放器的事件监听,确保每个音频播放结束时都能正确触发end
事件。
// 创建一个音频管理器类,用于管理多个音频播放器
class AudioManager {
constructor() {
this.players = {}; // 存储所有音频播放器的对象
}
// 创建一个新的音频播放器
createPlayer(src) {
const playerId = `player_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
const player = plus.audio.createPlayer(src);
// 绑定事件监听器
player.addEventListener('end', () => {
console.log(`Player ${playerId} ended.`);
// 可以在这里进行清理工作,比如删除player对象
// delete this.players[playerId];
});
// 存储播放器实例
this.players[playerId] = player;
return playerId; // 返回播放器ID,用于后续操作
}
// 播放指定ID的音频
play(playerId) {
const player = this.players[playerId];
if (player) {
player.play();
} else {
console.error(`Player with ID ${playerId} not found.`);
}
}
// 停止指定ID的音频
stop(playerId) {
const player = this.players[playerId];
if (player) {
player.stop();
} else {
console.error(`Player with ID ${playerId} not found.`);
}
}
}
// 使用示例
const audioManager = new AudioManager();
// 创建并播放多个音频
const player1Id = audioManager.createPlayer('_www/audio1.mp3');
const player2Id = audioManager.createPlayer('_www/audio2.mp3');
audioManager.play(player1Id);
audioManager.play(player2Id);
在这个示例中,我们创建了一个AudioManager
类来管理多个音频播放器。每个播放器在创建时都会分配一个唯一的ID,并绑定end
事件监听器。这样,即使同时播放多个音频文件,每个音频播放结束时都会独立触发其end
事件,避免了事件监听混乱的问题。
确保每个音频播放器的生命周期管理得当,比如在不需要时适时清理播放器对象,可以避免内存泄漏等问题。此外,检查音频文件的路径是否正确,以及确保在合适的时机调用播放和停止方法,也是避免问题的重要步骤。