Reputation: 161
How can I start next song immediately with AVPlayer? I have collections of song selected from iPod Library in MPMediaItemCollection which is shown in my UITableView [myPlaylistTable] . i know i have to use NSNotification to check whether song has finished ,but i dont know how to play the second or next song as soon as the current song finish playing .I have posted my code below
If anyone can help me with the solution it would be appreciated. Thanks
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
}
Upvotes: 2
Views: 4363
Reputation: 161
DShah i did it this way ..can u check if it is correct in my 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];
}
Upvotes: 1
Reputation: 9876
Please refer to the Apple's Link for help : http://developer.apple.com/library/ios/#documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/02_Playback.html
This link explain about Playing Multiple Items. You can use AVQueuePlayer
which is subclass of AVPlayer
for queuing the multiple songs.
EDIT
Please see the GitHub link : https://github.com/crocodella/AVPlayerSample For explanation : http://www.crocodella.com.br/2011/01/using-avplayer-to-play-background-music-from-library/
This link has same thing that you want.
Upvotes: 0