如何使用 audio_service 包调整 音频音量?我在 AudioHandler 类中没有看到任何可以执行此操作的方法。
例如,如何使用 Flutter UI 上的简单按钮调节音量,和/或在 5 秒内逐渐改变音量以淡入或淡出?
通过使用 setVolume 函数,这些操作对于 just_audio 来说很容易,但我不知道如何将其与 audio_service 集成。
这是我的完整性代码。
class MyAudioHandler extends BaseAudioHandler {
final _player = AudioPlayer();
MyAudioHandler() {
_player.playbackEventStream.map(updatePlaybackState).pipe(playbackState);
}
@override
Future<void> play() async {
await _player.play();
return super.play();
}
@override
Future<void> playMediaItem(MediaItem item) async {
mediaItem.add(item);
_player.setAudioSource(AudioSource.asset(item.id));
await _player.play();
return super.playMediaItem(item);
}
@override
Future<void> stop() async {
await _player.stop();
}
PlaybackState updatePlaybackState(PlaybackEvent event) {
return PlaybackState(
processingState: const {
ProcessingState.idle: AudioProcessingState.idle,
ProcessingState.loading: AudioProcessingState.loading,
ProcessingState.buffering: AudioProcessingState.buffering,
ProcessingState.ready: AudioProcessingState.ready,
ProcessingState.completed: AudioProcessingState.completed,
}[_player.processingState]!,
playing: _player.playing,
updatePosition: _player.position,
repeatMode: AudioServiceRepeatMode.all
);
}
}
return Scaffold(
body: StreamBuilder<PlaybackState>(
stream: _audioHandler.playbackState,
builder: (context, snapshot) {
bool isPlaying = snapshot.data?.playing ?? false;
return Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
if (isPlaying)
ElevatedButton(
onPressed: () {
_audioHandler.stop();
},
child: Text('Stop'),
)
else ...[
ElevatedButton(
onPressed: () async {
const item = MediaItem(
title: 'Sea',
id: 'assets/audio/seaside.mp3',
);
_audioHandler.playMediaItem(item);
},
child: Text('Play Seaside'),
),
],
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
//// HOW TO ADJUST VOLUME FROM BUTTONS???
IconButton(onPressed: () {}, icon: Icon(Icons.add)),
IconButton(onPressed: () {}, icon: Icon(Icons.remove)),
],
),
],
);
}),
);
AudioPlayer
提供了接受0-1的setVolume
方法。
player.setVolume(1.0);