使用AVPlayer进行流式传输很慢

时间:2017-03-06 12:21:59

标签: ios swift avplayer

我使用AVPlayer从互联网上传输mp3文件,但效果确实很慢。我发现使用分析器,它首先下载整个文件,然后开始播放。有没有解决方法呢?

现在,我正在使用此代码

if let player = player {
    NotificationCenter.default.removeObserver(self, name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: player.currentItem)

    let item = AVPlayerItem(url: url)

    player.replaceCurrentItem(with: item)
} else {
    player = AVPlayer(url: url)
}
player?.play()

我尝试过的事情:

  • 将玩家?.play()移动到观察者,附加到项目的状态属性
  • 使用属性 preferredForwardBufferDuration preferredPeakBitRate

结果一直是下载整个音频文件,然后才开始播放。

请注意,问题是 - 播放器仅在整个文件下载后开始播放,而我希望它能够播放mp3。

2 个答案:

答案 0 :(得分:4)

您可以尝试将player.automaticallyWaitsToMinimizeStalling = false设置为立即播放。

答案 1 :(得分:0)

您可以在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");
  }
  }
}