更新媒体收集队列MPMediaItemCollection时短暂停止/开始“正在播放"项目 [英] Brief stop/start of Now Playing item when updating a media collection queue MPMediaItemCollection
问题描述
我正在玩xcode中的apples addMusic示例应用程序,因为我希望能够添加类似的功能(在应用程序的后台播放用户选择的音乐队列).
Im playing about with apples addMusic sample app in xcode, as im looking to be able to add similar functionality (playing a queue of music selected by the user in the background of the app).
当用户在内置MediaPicker中选择了歌曲选择后,当用户单击完成"按钮时,音乐播放器会短暂停止播放,然后再次播放,这会造成令人讨厌的事情. -我假设这是由于apple所使用的方法,该方法将一个新数组应用为队列,并重置当前正在播放的状态(如上所示)
It does this annoying thing where the music player briefly stops before playing again when the user hits the 'Done' button after picking their song selections in the built in MediaPicker. - I'm assuming this is because of the method apple used, which applies a new array as the queue, and resets the now playing state as to where it left off (like so:)
// apply the new media item collection as a playback queue for the music player
[self setUserMediaItemCollection: mediaItemCollection];
[musicPlayer setQueueWithItemCollection: userMediaItemCollection];
[self setPlayedMusicOnce: YES];
[musicPlayer play];
// Obtain the music player's state so it can then be
// restored after updating the playback queue.
} else {
// Take note of whether or not the music player is playing. If it is
// it needs to be started again at the end of this method.
BOOL wasPlaying = NO;
if (musicPlayer.playbackState == MPMusicPlaybackStatePlaying) {
wasPlaying = YES;
}
// Save the now-playing item and its current playback time.
MPMediaItem *nowPlayingItem = musicPlayer.nowPlayingItem;
NSTimeInterval currentPlaybackTime = musicPlayer.currentPlaybackTime;
// Combine the previously-existing media item collection with the new one
NSMutableArray *combinedMediaItems = [[userMediaItemCollection items] mutableCopy];
NSArray *newMediaItems = [mediaItemCollection items];
[combinedMediaItems addObjectsFromArray: newMediaItems];
[self setUserMediaItemCollection: [MPMediaItemCollection collectionWithItems: (NSArray *) combinedMediaItems]];
// Apply the new media item collection as a playback queue for the music player.
[musicPlayer setQueueWithItemCollection: userMediaItemCollection];
// Restore the now-playing item and its current playback time.
musicPlayer.nowPlayingItem = nowPlayingItem;
musicPlayer.currentPlaybackTime = currentPlaybackTime;
// If the music player was playing, get it playing again.
if (wasPlaying) {
[musicPlayer play];
}
}
}
}
// If the music player was paused, leave it paused. If it was playing, it will continue to
// play on its own. The music player state is "stopped" only if the previous list of songs
// had finished or if this is the first time the user has chosen songs after app
// launch--in which case, invoke play.
- (void) restorePlaybackState {
if (musicPlayer.playbackState == MPMusicPlaybackStateStopped && userMediaItemCollection) {
if (playedMusicOnce == NO) {
[self setPlayedMusicOnce: YES];
[musicPlayer play];
}
}
}
有人遇到过这个问题吗?有没有其他人可以想到的替代/更有效的方法?
Anyone experienced this issue? Is there any alternative/more efficient methods that anyone can think of?
提前感谢您的分享:)
推荐答案
在Music Player更改通知时,将更改简单地应用于MPMediaItemCollection.
Simply apply the changes to MPMediaItemCollection at the point of Music Player changed notification.
这篇关于更新媒体收集队列MPMediaItemCollection时短暂停止/开始“正在播放"项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!