如何在播放队列中的下一个 mediaItem 时更改当前 mediaItem
How to change the current mediaItem when the next mediaItem in the queue is played
我正在 Flutter 中开发一个 iOS 应用程序,使用名为 audio_service 的包。
我使用 AudioServiceBackground.serQueue()
将多个 MediaItem 设置为一个队列。
在UI部分,我尝试使用AudioService.currentMediaItemStream
来显示当前播放的媒体项目的信息。
队列中的第一首歌曲播放完毕后,将播放第二首歌曲。但是,当前媒体项的信息没有改变。
如何检测队列中正在播放的歌曲发生了变化?
class AudioServiceScreen extends StatefulWidget {
@override
_AudioServiceScreenState createState() => _AudioServiceScreenState();
}
class _AudioServiceScreenState extends State<AudioServiceScreen> {
@override
void initState() {
super.initState();
Future(() async {
await AudioService.connect();
await start();
});
}
@override
void dispose() {
Future(() async {
await AudioService.disconnect();
});
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: ///,
body: StreamBuilder<MediaItem?>(
stream: AudioService.currentMediaItemStream,
builder: (context, snapshot) {
final mediaItem = snapshot.data;
},
),
);
}
Future<dynamic> start() async {
final success = await AudioService.start(
backgroundTaskEntrypoint: _backgroundTaskEntrypoint,
);
if (success) {
await updateQueue();
}
}
Future<void> updateQueue() async {
final queue = await getMediaLibrary(); // get data from FireStore
await AudioService.updateQueue(queue);
}
}
void _backgroundTaskEntrypoint() {
AudioServiceBackground.run(() => AudioPlayerTask());
}
class AudioPlayerTask extends BackgroundAudioTask {
final AudioPlayer audioPlayer = AudioPlayer();
@override
Future<void> onStart(Map<String, dynamic>? params) async {
final session = await AudioSession.instance;
await session.configure(const AudioSessionConfiguration.speech());
await AudioServiceBackground.setState(
controls: [MediaControl.pause, MediaControl.stop],
playing: false,
processingState: AudioProcessingState.connecting,
);
}
@override
Future<void> onUpdateQueue(List<MediaItem> queue) async {
await AudioServiceBackground.setQueue(queue);
try {
await audioPlayer.setAudioSource(ConcatenatingAudioSource(
children:
queue.map((item) => AudioSource.uri(Uri.parse(item.id))).toList(),
));
} on Exception catch (e) {
await onStop();
}
}
}
尝试阅读文档并按照其中的一些示例进行操作。因为在“背景代码”部分,有“开始”代码。也许该代码可以帮助您。很抱歉我帮不了你那么多。我从来没有尝试过那个包。
我正在 Flutter 中开发一个 iOS 应用程序,使用名为 audio_service 的包。
我使用 AudioServiceBackground.serQueue()
将多个 MediaItem 设置为一个队列。
在UI部分,我尝试使用AudioService.currentMediaItemStream
来显示当前播放的媒体项目的信息。
队列中的第一首歌曲播放完毕后,将播放第二首歌曲。但是,当前媒体项的信息没有改变。
如何检测队列中正在播放的歌曲发生了变化?
class AudioServiceScreen extends StatefulWidget {
@override
_AudioServiceScreenState createState() => _AudioServiceScreenState();
}
class _AudioServiceScreenState extends State<AudioServiceScreen> {
@override
void initState() {
super.initState();
Future(() async {
await AudioService.connect();
await start();
});
}
@override
void dispose() {
Future(() async {
await AudioService.disconnect();
});
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: ///,
body: StreamBuilder<MediaItem?>(
stream: AudioService.currentMediaItemStream,
builder: (context, snapshot) {
final mediaItem = snapshot.data;
},
),
);
}
Future<dynamic> start() async {
final success = await AudioService.start(
backgroundTaskEntrypoint: _backgroundTaskEntrypoint,
);
if (success) {
await updateQueue();
}
}
Future<void> updateQueue() async {
final queue = await getMediaLibrary(); // get data from FireStore
await AudioService.updateQueue(queue);
}
}
void _backgroundTaskEntrypoint() {
AudioServiceBackground.run(() => AudioPlayerTask());
}
class AudioPlayerTask extends BackgroundAudioTask {
final AudioPlayer audioPlayer = AudioPlayer();
@override
Future<void> onStart(Map<String, dynamic>? params) async {
final session = await AudioSession.instance;
await session.configure(const AudioSessionConfiguration.speech());
await AudioServiceBackground.setState(
controls: [MediaControl.pause, MediaControl.stop],
playing: false,
processingState: AudioProcessingState.connecting,
);
}
@override
Future<void> onUpdateQueue(List<MediaItem> queue) async {
await AudioServiceBackground.setQueue(queue);
try {
await audioPlayer.setAudioSource(ConcatenatingAudioSource(
children:
queue.map((item) => AudioSource.uri(Uri.parse(item.id))).toList(),
));
} on Exception catch (e) {
await onStop();
}
}
}
尝试阅读文档并按照其中的一些示例进行操作。因为在“背景代码”部分,有“开始”代码。也许该代码可以帮助您。很抱歉我帮不了你那么多。我从来没有尝试过那个包。