代码之家  ›  专栏  ›  技术社区  ›  KingPolygon

检测AVQueuePlayer中的当前项目并知道它何时更改?

  •  3
  • KingPolygon  · 技术社区  · 11 年前

    我现在有一个AVQueuePlayer,按顺序播放一些.aif文件。当它通过每个音频时,我想执行与特定声音相关的操作(例如更改imageview的uiimage)。

    我的问题是正确设置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];
    

    我觉得我被name参数卡住了。我应该把它改成什么?当它切换时,我该如何找到当前正在播放的播放器项目的名称?谢谢

    //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];
    
    
        }
    
    
    }
    
    2 回复  |  直到 11 年前
        1
  •  3
  •   BhushanVU    11 年前
    - (void)currentItemIs:(NSNotification *)notification 
    {
       AVPlayerItem *p = [notification object];
       if (p ==yellowVoice) {
       //rest of the code
       }
    }
    
        2
  •  2
  •   Pantelis Proios    9 年前

    Bhushan的回答缺少触发每个项目通知的循环,因此:

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