如何在第一首歌完成AVPlayer播放后继续播放第二首歌曲

时间:2012-08-04 16:46:37

标签: iphone objective-c ios xcode avplayer

如何使用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 
    }

2 个答案:

答案 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/

此链接与您想要的相同。