2017-01-18 16 views
1

Как я объясняю выше, если я запустил приложение и сначала отключил Wi-Fi, а затем попытаюсь воспроизвести музыку с AVPlayer, я получу AVPlayerItemStatusFailed, но после этого я больше не могу получать KVO callback, даже если я снова включу Wi-Fi.После первого сбоя AVPlayer я больше не могу получать обратный вызов KVO

С другой ситуации, если я запустить приложение и первый, чтобы включить Wi-Fi и играть, я могу получить AVPlayerItemStatusReadyToPlay и после этого, я могу продолжать получать KVO callback даже если я включаю WiFi выключен ...

Так как исправить первую ситуацию ???

@interface ViewController() 

@property (strong, nonatomic) AVPlayer *player; 
@property (assign, nonatomic) NSInteger index; 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
} 

- (IBAction)buttonPressed:(UIButton *)sender { 
    [self.player.currentItem removeObserver:self forKeyPath:@"status"]; 
    NSLog(@"removed %@", self.player.currentItem); 

    AVPlayerItem *item = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:self.urls[self.index]]]; 

    [item addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil]; 
    NSLog(@"added %@", item); 

    [self.player replaceCurrentItemWithPlayerItem:item]; 

} 

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context { 
    if ([keyPath isEqualToString:@"status"]) { 
     if ([object isMemberOfClass:[AVPlayerItem class]]) { 
      AVPlayerItem *playerItem = (AVPlayerItem *)object; 
      switch (playerItem.status) { 
       case AVPlayerItemStatusFailed: 
        NSLog(@"failed"); 
        break; 
       case AVPlayerItemStatusReadyToPlay: 
        NSLog(@"ready"); 
        break; 
       case AVPlayerItemStatusUnknown: 
        NSLog(@"unknown"); 
        break; 
      } 
     } 
    } 
} 

- (AVPlayer *)player { 
    if (!_player) { 
     _player = [[AVPlayer alloc] init]; 
    } 
    return _player; 
} 

- (NSArray *)urls { 
    return @[@"https://of92d29bn.qnssl.com/record1.m4a", @"https://of92d29bn.qnssl.com/record2.m4a"]; 
} 

- (NSInteger)index { 
    if (_index == 0) { 
     _index = 1; 
    } else { 
     _index = 0; 
    } 
    return _index; 
} 

Это все мой код.

+1

Как правило, я считаю, что если avplayer сыграл свой первый элемент и не смог, он больше не мог играть в какой-либо другой предмет! Кто-нибудь знает, почему ??? – wkx

ответ

1

Я была такая же проблема и нашли решение:

Сбросить элемент тока до нуля перед использованием нового:

[self.player replaceCurrentItemWithPlayerItem:nil]; 
[self.player replaceCurrentItemWithPlayerItem:item]; 

Это не имеет особого смысла, и там, наверное, ошибка в Реализация AVPlayer где-то. Но это сработало для меня.

+1

Понял то же самое через некоторое время. Ошибка все еще происходит в iOS 10.2, и это обходное решение работает. – glm4