1. 抽象音频管理接口
- 定义一个通用的
AudioManager
接口,包含基本的音频播放、暂停、停止、设置音量等方法。例如:
abstract class AudioManager {
Future<void> play(String audioPath);
void pause();
void stop();
void setVolume(double volume);
}
2. 平台特定实现
- iOS 实现:利用
AVFoundation
框架。在 AVAudioSession
中处理音频焦点,根据应用场景设置合适的 AVAudioSessionCategory
,如 AVAudioSessionCategoryPlayback
用于后台播放等。例如:
import 'package:avfoundation/avfoundation.dart';
class IOSAudioManager implements AudioManager {
AVAudioPlayer? _player;
@override
Future<void> play(String audioPath) async {
final url = URL(filePath: audioPath);
_player = await AVAudioPlayer(contentsOf: url);
await _player?.prepareToPlay();
await AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback);
await AVAudioSession.sharedInstance().setActive(true);
_player?.play();
}
@override
void pause() {
_player?.pause();
}
@override
void stop() {
_player?.stop();
_player = null;
}
@override
void setVolume(double volume) {
_player?.volume = volume;
}
}
- Android 实现:借助
Android MediaPlayer
类。通过 AudioManager
处理音量调节和音频焦点请求,使用 AudioAttributes
来设置音频属性。例如:
import 'package:android_media/android_media.dart';
class AndroidAudioManager implements AudioManager {
MediaPlayer? _player;
@override
Future<void> play(String audioPath) async {
_player = MediaPlayer();
await _player?.setDataSource(audioPath);
await _player?.prepare();
final audioManager = AudioManager(context: FlutterEngine.currentContext!);
await audioManager.requestAudioFocus();
_player?.setAudioAttributes(
AudioAttributes(
contentType: AudioContentType.music,
usage: AudioUsage.voiceCommunication,
),
);
_player?.start();
}
@override
void pause() {
_player?.pause();
}
@override
void stop() {
_player?.stop();
_player?.release();
_player = null;
}
@override
void setVolume(double volume) {
final audioManager = AudioManager(context: FlutterEngine.currentContext!);
audioManager.setStreamVolume(AudioSystem.STREAM_MUSIC, (volume * audioManager.getStreamMaxVolume(AudioSystem.STREAM_MUSIC)).toInt(), 0);
}
}
3. 跨平台调用
- 使用
flutter/services.dart
中的 MethodChannel
进行平台间通信,或者利用 flutter/foundation.dart
中的 kIsWeb
、kIsAndroid
、kIsIOS
等常量,在运行时根据平台创建对应的 AudioManager
实例。例如:
AudioManager getAudioManager() {
if (kIsIOS) {
return IOSAudioManager();
} else if (kIsAndroid) {
return AndroidAudioManager();
}
throw UnsupportedError('Unsupported platform');
}
4. 内存管理与性能优化
- 及时释放资源:在音频播放结束或页面销毁时,及时调用
stop
方法释放音频资源。例如,在 StatefulWidget
的 dispose
方法中调用 audioManager.stop()
。
- 缓存音频:对于频繁播放的音频,可以使用内存缓存策略。例如,维护一个
Map<String, AudioPlayer>
来存储已加载的音频,下次播放相同音频时直接从缓存中获取。
- 优化加载路径:提前准备好音频资源,在应用启动或页面预加载阶段,对可能用到的音频进行异步加载,减少实际播放时的加载延迟。
5. 声音流畅播放与交互
- 使用音频队列:对于多个音频顺序播放的场景,使用队列管理音频,保证播放的连续性。例如,创建一个
Queue
类来存储音频路径,并按照顺序依次播放。
- 事件监听:添加音频播放状态的监听,如播放完成、暂停、错误等事件,以便在 UI 上及时反馈和处理相关逻辑。例如,在
AudioManager
接口中添加 addListener
和 removeListener
方法,实现对音频状态变化的监听。