2013-03-11 52 views
3

我目前有一个AVQueuePlayer按顺序播放几个.aif文件。当它通过每个音频时,我想执行与该特定声音相关的操作(例如,更改imageview的uiimage)。检测AVQueuePlayer中的当前项目并知道它何时更改?

我的问题是正确设置NSNotification。我已经将它设置为在队列完成最后一个对象时通知我,但我无法接收每个当前项目的通知。以下是我有:

//Setting Up My Queue List 
    yellowVoice = [[AVPlayerItem alloc] initWithURL:[NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/YellowVoice.aif", [[NSBundle mainBundle] resourcePath]]]]; 
    orangeVoice = [[AVPlayerItem alloc] initWithURL:[NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/OrangeVoice.aif", [[NSBundle mainBundle] resourcePath]]]]; 
    redVoice = [[AVPlayerItem alloc] initWithURL:[NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/RedVoice.aif", [[NSBundle mainBundle] resourcePath]]]]; 
    pinkVoice = [[AVPlayerItem alloc] initWithURL:[NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/PinkVoice.aif", [[NSBundle mainBundle] resourcePath]]]]; 

    NSArray *soundEmotions = [NSArray arrayWithObjects:yellowVoice, orangeVoice, redVoice, pinkVoice, nil]; 

    soundQueue = [AVQueuePlayer queuePlayerWithItems:soundEmotions]; 

// Notify me when queue reaches the end of the last player item 
[[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(playerItemDidReachEnd:) 
               name:AVPlayerItemDidPlayToEndTimeNotification 
               object:[soundEmotions lastObject]]; 

// Notify me when a new player item begins and which one it is 
[[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(currentItemIs:) 
               name:AVPlayerItemDidPlayToEndTimeNotification 
               object:[soundQueue currentItem]]; 

[soundQueue play]; 

我觉得我坚持的名称参数。我应该怎样改变它?我如何才能找到当前正在播放的播放器项目的名称?谢谢!

//Here is one of the things I want to do with that info 
- (void)currentItemIs:(NSNotification *)notification { 

    if (soundQueue.currentItem ==yellowVoice) { 

     UIImage * yellowImage = [UIImage imageNamed:@"yellow.png"]; 
     [UIView transitionWithView:self.view 
          duration:1.0f 
          options:UIViewAnimationOptionTransitionCrossDissolve 
         animations:^{ 
          mainImage.image = yellowImage; 
         } completion:NULL]; 


    } 


    if (soundQueue.currentItem ==yellowVoice) { 

     UIImage * orangeImage = [UIImage imageNamed:@"orange.png"]; 
     [UIView transitionWithView:self.view 
          duration:1.0f 
          options:UIViewAnimationOptionTransitionCrossDissolve 
         animations:^{ 
          mainImage.image = orangeImage; 
         } completion:NULL]; 


    } 


} 
+0

有人吗?我真的很感激它。 – KingPolygon 2013-03-11 21:44:57

回答

3
- (void)currentItemIs:(NSNotification *)notification 
{ 
    AVPlayerItem *p = [notification object]; 
    if (p ==yellowVoice) { 
    //rest of the code 
    } 
} 
2

普山的回答是缺少循环触发通知每个项目,所以:

for (AVPlayerItem *playerItem in queuePlayer.items) { 
      [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(currentItemIs:) name:AVPlayerItemDidPlayToEndTimeNotification object:playerItem]; 
     }