You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter使用audio_session播放音效,iOS端无法压低其他应用音乐音量

解决Flutter iOS播放短音效时压低其他应用音乐音量的问题

问题分析

你当前的配置未生效,核心原因有两点:

  1. 仅配置了AudioSession但未主动激活,iOS需要明确激活session才能触发duckOthers效果;
  2. 使用AudioService(针对后台长音频播放的框架)处理短音效,可能干扰session的状态管理。

解决方案

改用轻量音频播放器(如just_audio)配合正确的AudioSession生命周期管理,步骤如下:

  1. 调整AudioSession配置与激活时机
    在播放短音效前动态配置并激活AudioSession,播放完成后停用以恢复其他音频:

    import 'package:audio_session/audio_session.dart';
    import 'package:just_audio/just_audio.dart';
    
    Future<void> playShortEffect(String assetPath) async {
      // 获取AudioSession实例并配置
      final session = await AudioSession.instance;
      await session.configure(const AudioSessionConfiguration(
        avAudioSessionCategory: AVAudioSessionCategory.playback,
        avAudioSessionCategoryOptions: AVAudioSessionCategoryOptions.duckOthers,
        avAudioSessionMode: AVAudioSessionMode.defaultMode,
        // Android端保持原有配置
        androidAudioAttributes: AndroidAudioAttributes(
          contentType: AndroidAudioContentType.music,
          usage: AndroidAudioUsage.media,
        ),
        androidAudioFocusGainType: AndroidAudioFocusGainType.gainTransientMayDuck,
      ));
    
      // 激活session,触发压低其他音频
      await session.setActive(true, 
        options: AVAudioSessionSetActiveOptions.notifyOthersOnDeactivation);
    
      // 初始化播放器并播放音效
      final player = AudioPlayer();
      try {
        await player.setAsset(assetPath);
        await player.play();
        // 播放完成后停用session,恢复其他音频音量
        player.playerStateStream.listen((state) {
          if (state.processingState == ProcessingState.completed) {
            session.setActive(false);
            player.dispose();
          }
        });
      } catch (e) {
        // 异常处理:停用session并释放播放器
        session.setActive(false);
        player.dispose();
        rethrow;
      }
    }
    
  2. 移除不必要的AudioService依赖
    短音效无需使用AudioService(该框架适用于后台持续播放场景),直接调用上述playShortEffect方法即可。

  3. 验证关键配置

    • 确保avAudioSessionCategory设为playback:这是iOS上实现音频压制的必需类别;
    • 保留avAudioSessionCategoryOptions.duckOthers:该选项明确告诉系统要压低其他应用的音频;
    • 激活session时添加notifyOthersOnDeactivation:确保停用session时通知其他应用恢复音量。

测试注意事项

  • 测试时需确保其他应用(如Apple Music)正在播放音频;
  • 若使用其他音频播放器(如audioplayers),需确保其与当前配置的AudioSession关联(多数主流播放器会自动关联)。

内容的提问来源于stack exchange,提问作者Flavio Aliu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 02:13:18