2

AVPlayer で次の曲をすぐに開始するにはどうすればよいですか? UITableView [myPlaylistTable]に表示される MPMediaItemCollection の iPod ライブラリから選択した曲のコレクションがあります。NSNotification を使用して曲が終了したかどうかを確認する必要があることはわかっていますが、現在の曲の再生が終了したらすぐに 2 番目または次の曲を再生する方法がわかりません。以下にコードを掲載しました。

誰かが解決策を手伝ってくれれば幸いです。ありがとう

   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 
    }
4

2 に答える 2

1

DSahh私はこのようにしました..それが私の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];
}
于 2012-08-08T11:58:05.990 に答える
0

ヘルプについては、Apple のリンクを参照してください: http://developer.apple.com/library/ios/#documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/02_Playback.html

このリンクはPlaying Multiple Itemsについて説明しています。複数の曲をキューに入れるAVQueuePlayerには、のサブクラスである which を使用できます。AVPlayer

編集

GitHub リンクを参照してください: https://github.com/crocodella/AVPlayerSample 説明: http://www.crocodella.com.br/2011/01/using-avplayer-to-play-background-music-from-図書館/

このリンクには、あなたが望むものと同じものがあります。

于 2012-08-04T18:07:40.370 に答える