使用audioplayers实现同时播放两段音频

399 阅读1分钟

1.创建两个AudioPlayer

在网上搜到的都是创建两个AudioPlayer类就可以实现同时播放两段音频,但实际上先加载的音频会被后加载的暂停

final AudioPlayer player = AudioPlayer();
final AudioPlayer bgmPlayer = AudioPlayer();

2.使用setAudioContext

android: AUDIOFOCUS属性设置不自动获取焦点,则不会暂停另一段音频。 AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK 是一种音频焦点请求类型。音频焦点用于管理设备上不同应用之间的音频播放优先级和行为。 AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK 除了具有临时获取焦点的特性外,还允许在获取焦点期间,其他应用可以继续播放音频,但音量会降低(“ducked”)。

实测降低音量可以忽略不计,建议使用setVolume降低音频的音量。

ios:mixWithOthers允许和其他音频同时播放,主音频设置duckOthers让另一段音频降低音量播放。

//主音频 
player.setAudioContext(
   AudioContext(
     android: AudioContextAndroid(
       audioFocus: AndroidAudioFocus.none,
       contentType: AndroidContentType.music,
       usageType: AndroidUsageType.media,
     ),
     iOS: AudioContextIOS(
       category: AVAudioSessionCategory.playback,
       options: {
         AVAudioSessionOptions.mixWithOthers,
         AVAudioSessionOptions.duckOthers,
       },
     ),
  ),
);

// 背景音乐(不请求焦点)
bgmPlayer.setAudioContext(
  AudioContext(
    android: AudioContextAndroid(
      audioFocus: AndroidAudioFocus.gainTransientMayDuck,
      contentType: AndroidContentType.music,
      usageType: AndroidUsageType.media,
    ),
    iOS: AudioContextIOS(
      category: AVAudioSessionCategory.playback,
      options: {
        AVAudioSessionOptions.mixWithOthers,
      },
    ),
  ),
);

3.扩展

要实现在主音频播放时,背景音乐不断循环,可以通过监听主音频的完成事件,在主音频完成时停止背景音乐,同时监听背景音乐的完成事件,在背景音乐完成时重新播放,实现循环。也可以通过bgmPlayer.setReleaseMode(ReleaseMode.loop);实现循环播放

player.onPlayerComplete.listen((_) {
  // 长音频播放完成,停止短音频
  bgmPlayer.stop();
});
// 监听短音频播放完成事件
bgmPlayer.onPlayerComplete.listen((_) {
  // 短音频播放完成,重新播放短音频以实现循环
  bgmPlayer.play(UrlSource(widget.bgmUrl));
});