Ios 在AVPlayer中使用坏internet播放流

Ios 在AVPlayer中使用坏internet播放流,ios,streaming,avfoundation,avplayer,Ios,Streaming,Avfoundation,Avplayer,当AVPlayer播放来自网络流的资源时,它会在下载内容结束时暂停 所以,我的问题是,如何知道它是因为坏的网络而停止的?以及如何在下载后播放,比方说,接下来10秒的资产?当AVPlayer获得空缓冲区时,您可以添加一个观察者: [[self.tracksPlayer currentItem] addObserver:self forKeyPath:@"playbackBufferEmpty"

当AVPlayer播放来自网络流的资源时,它会在下载内容结束时暂停


所以,我的问题是,如何知道它是因为坏的网络而停止的?以及如何在下载后播放,比方说,接下来10秒的资产?

当AVPlayer获得空缓冲区时,您可以添加一个观察者:

[[self.tracksPlayer currentItem] addObserver:self 
                                  forKeyPath:@"playbackBufferEmpty" 
                                     options:NSKeyValueObservingOptionNew
                                     context:nil];
还有一个观察者,这样您就可以知道AVPlayer的缓冲时间是否足以跟上:

[[self.tracksPlayer currentItem] addObserver:self 
                                  forKeyPath:@"playbackLikelyToKeepUp" 
                                     options:NSKeyValueObservingOptionNew 
                                     context:nil];
然后只需在KVO回调中检查:

- (void)observeValueForKeyPath:(NSString *)keyPath 
                      ofObject:(id)object 
                        change:(NSDictionary *)change 
                       context:(void *)context {

   if (object == [self.tracksPlayer currentItem] && 
      [keyPath isEqualToString:@"playbackBufferEmpty"]) {

      if ([self.tracksPlayer currentItem].playbackBufferEmpty) {
          NSLog(@"Buffer Empty"); 
      }
   } else if (object == [self.tracksPlayer currentItem] && 
             [keyPath isEqualToString:@"playbackLikelyToKeepUp"]) {

      if ([self.tracksPlayer currentItem].playbackLikelyToKeepUp) {
          NSLog(@"LikelyToKeepUp");
      }
   }
}

用于swift

1)
let playbackLikelyToKeepUpContext = UnsafeMutablePointer<(Void)>(nil)
 or
let playbackLikelyToKeepUpContext = UnsafeMutablePointer<(Void)>()

2) //Add Observer

  player.addObserver(self, forKeyPath: "currentItem.playbackLikelyToKeepUp",
                                    options: NSKeyValueObservingOptions.New, context: playbackLikelyToKeepUpContext)
  player.play()

3)

//Add observer
    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {

        guard keyPath != nil else { // a safety precaution
            super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context)
            return
        }

        if (context == playbackLikelyToKeepUpContext)
        {
            if (player.currentItem!.playbackLikelyToKeepUp) {
                player.play()
                Utilities.hideHUD(self.view)
            }
            else {
                Utilities.showHUD(self.view)
            }
        }
    }

4) // Remove Observer

override func viewDidDisappear(animated: Bool) {
        player.removeObserver(self, forKeyPath: "currentItem.playbackLikelyToKeepUp")
    }
1)
让playbackLikelyToKeepUpContext=UnsafeMutablePointer(nil)
或
让playbackLikelyToKeepUpContext=UnsafeMutablePointer()
2) //添加观察者
player.addObserver(self,forKeyPath:“currentItem.playbackLikelyToKeepUp”,
选项:NSKeyValueObservingOptions.New,上下文:playbackLikelyToKeepUpContext)
player.play()
3)
//添加观察者
重写func observeValueForKeyPath(键路径:String?,对象对象的类型:AnyObject?,更改:[String:AnyObject]?,上下文:UnsafeMutablePointer){
守卫钥匙路径!=无其他{//安全预防措施
super.observeValueForKeyPath(键路径,of对象:object,change:change,context:context)
返回
}
if(context==playbackLikelyToKeepUpContext)
{
如果(player.currentItem!.playbackLikelyToKeepUp){
player.play()
实用程序.hideHUD(self.view)
}
否则{
实用程序.showHUD(self.view)
}
}
}
4) //删除观察者
覆盖func VIEWDID消失(动画:Bool){
player.removeObserver(self,forKeyPath:“currentItem.playbackLikelyToKeepUp”)
}

Swift 4改变了KVO的方式。我们在一个地方使用闭包(块),而不是单独添加观察者和函数

var observers: [NSKeyValueObservation]?
let playerItem = AVPlayerItem(url: YOUR_URL)

let emptyObserver = playerItem.observe(\.isPlaybackBufferEmpty) {
                        [weak self] (object, observedChange) in
                        // show a progress bar 
                        print("isPlaybackBufferEmpty")
                    }

let keepUpObserver = playerItem.observe(\.playbackLikelyToKeepUp) {
                        [weak self] (object, observedChange) in
                        // hide progress bar and keep going 
                        print("playbackLikelyToKeepUp")
                    }

self.observers = [emptyObserver, keepUpObserver]

苹果公司的文档中说,playbackLikelyToKeepUp可能是
NO
,即使
playbackufferfull
YES
。据我所知,
playbackLikelyToKeepUp
基于互联网连接速度,而不是缓冲区中的数据量。这实际上是次要的,您可以使用它,也可以不使用它。虽然我不知道,但感谢您提供的信息:)因此我需要观察
loadedTimeRanges
属性并检查它是否加载足够?您还可以观察status属性并检查
if(self.tracksplayer.status==AVPlayerStatusReadyToPlay)