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个声音同时播放,监听的endedplay事件应该执行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

3 回复

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事件,避免了事件监听混乱的问题。

确保每个音频播放器的生命周期管理得当,比如在不需要时适时清理播放器对象,可以避免内存泄漏等问题。此外,检查音频文件的路径是否正确,以及确保在合适的时机调用播放和停止方法,也是避免问题的重要步骤。

回到顶部