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));
});