Как я объясняю выше, если я запустил приложение и сначала отключил 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;
}
Это все мой код.
Как правило, я считаю, что если avplayer сыграл свой первый элемент и не смог, он больше не мог играть в какой-либо другой предмет! Кто-нибудь знает, почему ??? – wkx