我正在构建一个需要播放曲目列表的应用,但是在每首歌曲之间音乐应该暂停以执行一些代码,然后一旦完成,音乐应该恢复。当应用程序在后台以及前台时,这需要工作。
我尝试了几种方法,但似乎没有人能够做我想做的一切。
AVQueuePlayer - 我似乎无法确定任何一首歌何时停止,只有在整个队列停止时才会停止。
AVPlayer - 我可以通过通知确定音轨何时结束,然后我可以运行我的额外代码,然后加载下一首曲目。只要应用程序不在后台,当应用程序在后台时代码执行正常,除了[avPlayer play]
命令不起作用,这样就可以正常工作。它不会抛出错误,它根本就不会播放。我知道它已经移动到下一首歌并将其加载到AVPlayer中,因为我输出了元数据并且已经移动了。
为了清楚初始轨道确实在后台运行,它只是启动下一个不在后台运行的轨道。
以下代码......
知道我做错了什么吗?
谢谢!
+(void) playItem {
//get the play item from the song array based on intSongIndex
MPMediaItem *currentSong = [songsNowPlaying objectAtIndex:intSongIndex];
AVPlayerItem * currentItem = [AVPlayerItem playerItemWithURL:[currentSong valueForProperty:MPMediaItemPropertyAssetURL]];
[avPlayer replaceCurrentItemWithPlayerItem:currentItem];
//add notification to the currentItem
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(playerItemDidReachEnd:)
name:AVPlayerItemDidPlayToEndTimeNotification
object:currentItem];
//play
[avPlayer play];
NSArray *metadataList = [[avPlayer currentItem].asset commonMetadata];
for (AVMetadataItem *metaItem in metadataList) {
NSLog(@"%@: %@",[metaItem commonKey], [metaItem value]);
}
//increment song index so next time the next song is selected
intSongIndex ++;
if (intSongIndex >= songsNowPlaying.count) {
intSongIndex = 0;
}
}
+ (void)playerItemDidReachEnd:(NSNotification *)notification {
//add code to be executed before the next song plays
//call playItem to play the next song
[self playItem];
}
答案 0 :(得分:0)
解决了,这需要添加到初始viewDidLoad
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];