как продолжить воспроизведение второй песни после завершения воспроизведения первой песни в AVPlayer

Как я могу сразу начать следующую песню с помощью AVPlayer? У меня есть коллекции песен, выбранные из библиотеки iPod в MPMediaItemCollection, которая отображается в моем 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 
    }

person orgami    schedule 04.08.2012    source источник


Ответы (2)


Дшах, я сделал это вот так .. могу ли ты проверить, правильно ли это в моем представленииDidLoad ..

     [[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];
}
person orgami    schedule 08.08.2012
comment
Это работает?? В противном случае вам нужно изменить текущий элемент на следующий элемент в списке. См.: stackoverflow.com/ questions / 11661859 / - person DShah; 08.08.2012
comment
Только для вашего Ref: stackoverflow.com/questions/11716259/, а также посмотрите: stackoverflow.com/questions/4605905/ - person DShah; 08.08.2012

Для получения справки перейдите по ссылке 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/

В этой ссылке есть то же, что и вам.

person DShah    schedule 04.08.2012
comment
NSArray * items = ‹# Массив элементов игрока #›; AVQueuePlayer * queuePlayer = [[выделение AVQueuePlayer] initWithItems: элементы]; AVPlayerItem * anItem = ‹# Получить элемент плеера #›; if ([queuePlayer canInsertItem: элемент afterItem: nil]) {[queuePlayer insertItem: anItem afterItem: nil]; } Так как я беру песни из библиотеки ipod и помещаю их в пользовательский tableview, как он узнает, что песня закончена, а следующая песня должна продолжаться - person orgami; 04.08.2012
comment
Поскольку вы зарегистрировали уведомление для AVPlayerItemDidPlayToEndTimeNotification, всякий раз, когда песня будет завершена, ваш метод выбора будет запущен ... - person DShah; 04.08.2012
comment
да, я не знаю, как получить следующую песню и начать играть после того, как текущая песня закончится. - person orgami; 04.08.2012
comment
Так же, как вы начали первую песню, но с той лишь разницей, что теперь вы напишете логику внутри метода селектора. Обрабатывайте метод Selector всякий раз, когда заканчивается первая песня. - person DShah; 04.08.2012
comment
Обратитесь к разделу Реагирование на изменение статуса в ссылке, KVO зарегистрирован. Это похоже на уведомление (помните, но не то же самое, что и уведомление). - person DShah; 04.08.2012
comment
он работает в фоновом режиме, я просто хочу, чтобы игрок продолжил воспроизведение следующей песни, как только песня, которая играет, закончится - person orgami; 05.08.2012
comment
Можете ли вы включить какой-нибудь код, как у вас дела? так что я могу помочь вам с вашей логикой. Пожалуйста, укажите код вашего метода выбора. - person DShah; 05.08.2012
comment
не могли бы вы просто сделать продолжение к следующей песне и от первой проблемы с песней, и когда я попытаюсь добавить новые песни, старая песня, которая играла, остановится, и новая песня, которая играла, начнет играть, это было бы большим подспорьем .. я буду выяснить остальную часть проблемы .. потому что мне нужно отправить этот проект моему профессору через 2 дня :( - person orgami; 07.08.2012
comment
@orgami: Вот точное решение, которое вы запрашиваете для второй песни, чтобы начать вход в систему: stevetranby.com/blog/2010/09/ - person DShah; 08.08.2012