如何使用AVPlayer立即开始下一首歌?我在MPMediaItemCollection中从iPod库中选择了歌曲集,该歌曲显示在我的UITableView [myPlaylistTable] 中。我知道我必须使用NSNotification来检查歌曲是否已经完成,但我不知道当前歌曲播放完毕后如何播放第二首或下一首歌曲。我已经在下面发布了我的代码
如果有人可以帮我解决这个问题,我们将不胜感激。 感谢
in viewDidLoad i have initialized
- (void)viewDidLoad
{
[super viewDidLoad];
//[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[self.myPlaylistTable deselectRowAtIndexPath:[self.myPlaylistTable indexPathForSelectedRow] animated:NO];
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: nil];
UInt32 doSetProperty = 0;
AudioSessionSetProperty (
kAudioSessionProperty_OverrideCategoryMixWithOthers,
sizeof (doSetProperty),
&doSetProperty
);
[self becomeFirstResponder];
myPlaylistTable.hidden=YES;
playlistSongsArray =[[NSMutableArray alloc]init];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(nextSongPlaying:)
name:AVPlayerItemDidPlayToEndTimeNotification
object:[myPlayer currentItem]];
}
-(void) mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection {
// Dismiss selection view
[self dismissViewControllerAnimated:YES completion:nil];
// Get AVAsset
NSURL* assetUrl = [mediaItemCollection.representativeItem valueForProperty:MPMediaItemPropertyAssetURL];
AVURLAsset* asset = [AVURLAsset URLAssetWithURL:assetUrl options:nil];
AVPlayerItem* playerItem = [AVPlayerItem playerItemWithAsset:asset];
myPlayer = [AVPlayer playerWithPlayerItem:playerItem];
[playlistSongsArray addObjectsFromArray:mediaItemCollection.items];
NSLog(@" Playlist songs %@",playlistSongsArray);
[self.myPlaylistTable reloadData];
[myPlayer play];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[self becomeFirstResponder];
}
- (BOOL)canBecomeFirstResponder
{
return YES;
}
- (UITableViewCell *) tableView: (UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath {
NSInteger row = [indexPath row];
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: kCellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:kCellIdentifier];
UILabel *playbackDurationLabel =[[UILabel alloc]initWithFrame:CGRectMake(205, 88, 103, 18)];
playbackDurationLabel.tag = 100;
playbackDurationLabel.backgroundColor = [UIColor clearColor];
playbackDurationLabel.textColor = [UIColor orangeColor];
playbackDurationLabel.font = [UIFont fontWithName:@"Helvetica" size:14];
[cell.contentView addSubview:playbackDurationLabel];
}
if (tableView == myPlaylistTable)
{
MPMediaItem *mediaItem = (MPMediaItem *)[playlistSongsArray objectAtIndex:row];
MPMediaItemArtwork *artwork = [mediaItem valueForProperty:MPMediaItemPropertyArtwork];
if (mediaItem)
{
cell.textLabel.text = [mediaItem valueForProperty:MPMediaItemPropertyTitle];
cell.textLabel.textColor = [UIColor redColor];
cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:15];
cell.textLabel.numberOfLines=0;
cell.detailTextLabel.text = [mediaItem valueForProperty:MPMediaItemPropertyArtist];
cell.detailTextLabel.textColor = [UIColor blueColor];
cell.detailTextLabel.font = [UIFont fontWithName:@"Helvetica" size:14];
cell.detailTextLabel.numberOfLines=0;
UILabel *songDurationLabel = (UILabel *) [cell.contentView viewWithTag:100];
songDurationLabel.text=[self secondsFormatted:[[mediaItem valueForProperty:MPMediaItemPropertyPlaybackDuration] intValue]];
NSLog(@"song duration - %@",[[mediaItem valueForProperty:MPMediaItemPropertyPlaybackDuration] stringValue]);
if (artwork != nil)
{
cell.imageView.image = [artwork imageWithSize:CGSizeMake(60, 60)];
}
else
{
cell.imageView.image = [UIImage imageNamed:@"noArtworkImage.png"];
}
}
[tableView deselectRowAtIndexPath: indexPath animated: YES];
}
return cell;
}
-(void)nextSongPlaying:(NSNotification *)notification
{
//What stuff to do
}
答案 0 :(得分:1)
DShah我是这样做的。你可以检查我的viewDidLoad中是否正确..
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(nextSongPlaying:)
name:AVPlayerItemDidPlayToEndTimeNotification
object:[myPlayer currentItem]];
- (void)nextSongPlaying:(NSNotification *)notification
{
AVPlayerItem *playerItem = [notification object];
[playerItem seekToTime:kCMTimeZero];
[myPlayer play];
}
答案 1 :(得分:0)
请参阅Apple的链接获取帮助:http://developer.apple.com/library/ios/#documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/02_Playback.html
此链接说明播放多个项目。您可以使用AVQueuePlayer
作为AVPlayer
的子类来排队多首歌曲。
修改强>
请参阅GitHub链接:https://github.com/crocodella/AVPlayerSample 有关解释:http://www.crocodella.com.br/2011/01/using-avplayer-to-play-background-music-from-library/
此链接与您想要的相同。