Flutter音频服务插件audio_service的使用
Flutter音频服务插件audio_service的使用
介绍
audio_service
是一个用于Flutter应用程序的插件,它允许你的音频代码在后台运行,并与媒体通知、锁屏、耳机按钮、可穿戴设备和Android Auto进行交互。该插件支持Android、iOS、Web和Linux(通过 audio_service_mpris)。适用于以下场景:
- 音乐播放器
- 文本转语音阅读器
- 播客播放器
- 视频播放器
- 导航器
- 更多!
插件工作原理
你需要将你的音频代码封装在一个实现了标准系统回调的 AudioHandler
中,以统一处理来自不同来源的媒体播放请求。例如,一个文本转语音阅读器应用可以使用 flutter_tts 来实现这些回调,而一个音乐播放器应用则可以使用 just_audio 来渲染音频。
支持的功能特性
特性 | Android | iOS | macOS | Web |
---|---|---|---|---|
背景音频 | ✅ | ✅ | ✅ | ✅ |
耳机点击 | ✅ | ✅ | ✅ | ✅ |
播放/暂停/快进/倒退/停止 | ✅ | ✅ | ✅ | ✅ |
快速前进/回退 | ✅ | ✅ | ✅ | ✅ |
重复/随机模式 | ✅ | ✅ | ✅ | ✅ |
队列操作,跳过下一个/上一个 | ✅ | ✅ | ✅ | ✅ |
自定义动作/事件/状态 | ✅ | ✅ | ✅ | ✅ |
通知/控制中心 | ✅ | ✅ | ✅ | ✅ |
锁屏控制 | ✅ | ✅ | ❌ | ✅ |
专辑封面 | ✅ | ✅ | ✅ | ✅ |
Android Auto, Apple CarPlay | ✅ | ✅ | ❌ | ❌ |
使用教程和文档
- Flutter中使用Audio Service和Just Audio实现背景音频
- 教程: 构建简单音频播放器并解释基本概念。
- 完整示例: GitHub上的
example
子目录演示了音乐和文本转语音用例。 - 常见问题解答
- API文档
示例代码
以下是audio_service
的基本使用示例,包括初始化、发送请求到音频处理器以及监听状态变化等。
初始化
class MyAudioHandler extends BaseAudioHandler with QueueHandler, SeekHandler {
final _player = AudioPlayer();
// 常见回调方法
Future<void> play() => _player.play();
Future<void> pause() => _player.pause();
Future<void> stop() => _player.stop();
Future<void> seek(Duration position) => _player.seek(position);
Future<void> skipToQueueItem(int i) => _player.seek(Duration.zero, index: i);
}
Future<void> main() async {
// 存储为单例
_audioHandler = await AudioService.init(
builder: () => MyAudioHandler(),
config: AudioServiceConfig(
androidNotificationChannelId: 'com.mycompany.myapp.channel.audio',
androidNotificationChannelName: 'Music playback',
),
);
runApp(new MyApp());
}
发送请求到音频处理器
_audioHandler.play();
_audioHandler.seek(Duration(seconds: 10));
_audioHandler.setSpeed(1.5);
_audioHandler.pause();
_audioHandler.stop();
// 播放特定媒体项
var item = MediaItem(
id: 'https://example.com/audio.mp3',
album: 'Album name',
title: 'Track title',
artist: 'Artist name',
duration: const Duration(milliseconds: 123456),
artUri: Uri.parse('https://example.com/album.jpg'),
);
_audioHandler.playMediaItem(item);
_audioHandler.playFromSearch(queryString);
_audioHandler.playFromUri(uri);
_audioHandler.playFromMediaId(id);
// 队列管理
_audioHandler.addQueueItem(item);
_audioHandler.insertQueueItem(1, item);
_audioHandler.removeQueueItem(item);
_audioHandler.updateQueue([item, ...]);
_audioHandler.skipToNext();
_audioHandler.skipToPrevious();
_audioHandler.skipToQueueItem(2);
// 循环和随机播放
_audioHandler.setRepeatMode(AudioServiceRepeatMode.one); // none/one/all/group
_audioHandler.setShuffleMode(AudioServiceShuffleMode.all); // none/all/group
// 自定义动作
_audioHandler.customAction('setVolume', {'volume': 0.8});
_audioHandler.customAction('saveBookmark');
广播状态变化
mediaItem.add(item1);
queue.add(<MediaItem>[item1, item2, item3]);
playbackState.add(PlaybackState(
controls: [
MediaControl.skipToPrevious,
MediaControl.pause,
MediaControl.stop,
MediaControl.skipToNext,
],
systemActions: const {
MediaAction.seek,
MediaAction.seekForward,
MediaAction.seekBackward,
},
androidCompactActionIndices: const [0, 1, 3],
processingState: AudioProcessingState.ready,
playing: true,
updatePosition: Duration(milliseconds: 54321),
bufferedPosition: Duration(milliseconds: 65432),
speed: 1.0,
queueIndex: 0,
));
playbackState.add(playbackState.value.copyWith(
speed: newSpeed,
));
监听状态变化
_audioHandler.mediaItem.listen((MediaItem item) { ... });
_audioHandler.queue.listen((List<MediaItem> queue) { ... });
_audioHandler.playbackState.listen((PlaybackState state) {
if (state.playing) ... else ...
switch (state.processingState) {
case AudioProcessingState.idle: ...
case AudioProcessingState.loading: ...
case AudioProcessingState.buffering: ...
case AudioProcessingState.ready: ...
case AudioProcessingState.completed: ...
case AudioProcessingState.error: ...
}
});
AudioService.position.listen((Duration position) { ... });
完整示例
完整的示例代码可以在GitHub仓库中找到,其中包括了更多高级特性和详细的实现细节。
更多关于Flutter音频服务插件audio_service的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复