AVPlayer Observer никогда не вызывал неверный URL - PullRequest
9 голосов
/ 20 марта 2012

Я пытаюсь создать базовое приложение для радио и получил список URL: когда я пытаюсь вызвать неверный URL (неправильный путь или правильный путь без воспроизводимого файла), Observer, кажется, никогда не вызывается.Вот часть моего кода:

        urlStream = [NSURL URLWithString:mp3URL];  

        self.playerItem = [AVPlayerItem playerItemWithURL:urlStream];

        [playerItem addObserver:self forKeyPath:@"playbackBufferEmpty"   options:NSKeyValueObservingOptionNew context:nil];
        [playerItem addObserver:self forKeyPath:@"playbackLikelyToKeepUp" options:NSKeyValueObservingOptionNew context:nil];
        [appDelegate.player addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];

        [appDelegate.player replaceCurrentItemWithPlayerItem:playerItem]; //OK

        [appDelegate.player play];

и в методе относительного наблюдателя, который я получил:

    if (object == playerItem && [keyPath isEqualToString:@"playbackBufferEmpty"])
{
    if (playerItem.playbackBufferEmpty) 
    {
        NSLog(@"playbackBufferEmpty");
        [self alertBuffer];
    }

}

if (object == playerItem && [keyPath isEqualToString:@"playbackLikelyToKeepUp"])
{
    if (playerItem.playbackLikelyToKeepUp)
    {
        NSLog(@"playbackLikelyToKeepUp");
        [loadStation stopAnimating];

        if (playerItem.status == AVPlayerItemStatusReadyToPlay) {
            NSLog(@"AVPlayerItemStatusReadyToPlay");
        }
        else if (playerItem.status == AVPlayerStatusFailed) {
            NSLog(@"AVPlayerStatusFailed");
        }
        else if (playerItem.status == AVPlayerStatusUnknown) {
            NSLog(@"AVPlayerStatusUnknown");
        }
    }
}

else if (object == appDelegate.player && [keyPath isEqualToString:@"status"]) {
    if (appDelegate.player.status == AVPlayerStatusReadyToPlay) {
        NSLog(@"Player Status = Ready to Play");

    } 
    if (appDelegate.player.status == AVPlayerStatusUnknown) {
        NSLog(@"Player Status = Sometimes did wrong.");
        [self alertUnknown];
    }
    if (appDelegate.player.status == AVPlayerStatusFailed) {
        NSLog(@"Player Status = Status Failed.");
        [self alertStatusFailed];
    }

}

По какому бы URL я ни звонил, я получал только статус ReadyToPlay: когда я выбираю недействительныйURL ничего не происходит.Пример не работающего URL: http://audioplayer.wunderground.com:80/RHBrant/Cheyenne.mp3.m3u

Где я ошибаюсь?

Спасибо ОЧЕНЬ большое.

1 Ответ

10 голосов
/ 22 марта 2012

Хорошо, я нашел свою ошибку: я добавлял наблюдателя в appDelegate.player, чтобы поймать плохой URL, когда все, что мне нужно было сделать, это добавить в playerItem:

        [playerItem addObserver:self forKeyPath:@"status" options:0 context:nil];

и в относительном методе:

         if ([playerItem status] == AVPlayerStatusFailed) {
             NSLog(@"playerItem Status = Failed.");
             NSLog(@"Error = %@",error.description);
             return;
         }

Теперь все в порядке.

Thanx

...