You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

3.8 KiB

音频与背景音乐交互功能说明

Bug修复记录

问题描述

当音频播放时点击背景音乐按钮,背景音乐暂停音频并开始播放。此时再点击关闭背景音乐,图标显示关闭状态但背景音乐仍在播放。

问题原因

  1. 点击背景音乐按钮时会发送事件暂停音频
  2. 音频暂停时会调用restoreBackgroundMusic恢复背景音乐
  3. 然后MusicControl再执行自己的切换逻辑
  4. 导致背景音乐被恢复后又被操作,状态混乱

解决方案

  1. MusicControl组件优化

    • 检测是否有音频在播放
    • 如有音频,先暂停音频,延迟执行背景音乐切换
    • 如无音频,直接切换背景音乐状态
  2. AudioControl组件优化

    • 在handleBackgroundMusicToggle中只暂停音频
    • 不自动恢复背景音乐,让MusicControl自己控制

修复后的交互流程

graph TD
A[点击背景音乐按钮] --> B{是否有音频播放?}
B -->|是| C[发送暂停音频事件]
C --> D[AudioControl暂停音频\n不恢复背景音乐]
D --> E[延迟100ms后切换背景音乐]
B -->|否| F[直接切换背景音乐状态]

实现的功能

🎵 背景音乐控制音频

当点击背景音乐控制按钮时:

  • 如果有音频正在播放,会自动暂停音频
  • 然后正常切换背景音乐的播放/暂停状态

🎧 音频控制背景音乐

当点击音频控制按钮时:

  • 播放音频时自动暂停背景音乐
  • 暂停音频时自动恢复背景音乐
  • 音频播放结束时自动恢复背景音乐

技术实现

事件通信机制

使用uni-app的全局事件机制实现组件间通信:

// AudioControl组件发送事件
uni.$emit('audioPlaying', true/false);

// MusicControl组件发送事件  
uni.$emit('backgroundMusicToggle');

// 组件监听事件
uni.$on('eventName', this.handlerFunction);

交互流程

点击背景音乐按钮:

graph TD
A[点击背景音乐按钮] --> B[发送backgroundMusicToggle事件]
B --> C[AudioControl收到事件]
C --> D{音频是否在播放?}
D -->|是| E[暂停音频]
D -->|否| F[继续背景音乐操作]
E --> G[恢复背景音乐]
F --> H[切换背景音乐状态]

点击音频按钮:

graph TD
A[点击音频按钮] --> B{当前音频状态?}
B -->|未播放| C[暂停背景音乐]
C --> D[播放音频]
D --> E[发送audioPlaying:true事件]
B -->|正在播放| F[暂停音频]
F --> G[恢复背景音乐]
G --> H[发送audioPlaying:false事件]

使用方法

在页面中同时使用两个组件:

<template>
  <view class="page-container">
    <!-- 页面内容 -->
    
    <!-- 音频控制组件 -->
    <AudioControl :audioSrc="audioUrl" />
    
    <!-- 背景音乐控制组件 -->
    <MusicControl />
  </view>
</template>

<script>
import AudioControl from '@/components/AudioControl.vue';
import MusicControl from '@/components/MusicControl.vue';

export default {
  components: {
    AudioControl,
    MusicControl
  },
  data() {
    return {
      audioUrl: this.showImg('/uploads/audio/your-audio.mp3')
    }
  }
}
</script>

优势特点

智能交互

  • 两个组件能够智能感知对方的状态
  • 避免同时播放音频和背景音乐造成的冲突
  • 提供良好的用户体验

解耦设计

  • 组件间通过事件通信,保持松耦合
  • 每个组件都能独立工作
  • 易于维护和扩展

状态同步

  • 实时同步音频和背景音乐的播放状态
  • 确保状态的一致性和准确性

注意事项

  1. 事件监听清理:组件销毁时会自动清理事件监听,避免内存泄漏
  2. 状态管理:两个组件都维护各自的状态,通过事件保持同步
  3. 错误处理:包含完善的错误处理机制,确保功能稳定运行