【问题标题】:Using AVPlayer for streaming is slow使用 AVPlayer 进行流式传输很慢
【发布时间】:2017-07-26 07:39:19
【问题描述】:

我使用 AVPlayer 从 Internet 流式传输 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()

我尝试过的事情:

  • 将 player?.play() 移动到观察者,附加到项目的 status 属性
  • 玩转属性 preferredForwardBufferDuration 和 preferredPeakBitRate

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

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

【问题讨论】:

  • 尝试使用:player.automaticallyWaitsToMinimizeStalling = false
  • @Suen,是的!它现在在整个加载之前播放。您能否将您的评论更改为答案,以便其他人更容易看到?

标签: ios swift avplayer


【解决方案1】:

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

【讨论】:

  • 我不确定,我明白,它对我有什么帮助
  • Apple 文档指出,playbackLikelyToKeepUp 可能为 NO,即使 PlaybackBufferFull 为 YES。据我了解,playbackLikelyToKeepUp 是基于互联网连接速度,而不是缓冲区中的数据量。
  • 仍然,我不明白,它对我有什么帮助。即使我知道,由于某些原因,它还不能播放 - 我该如何帮助它开始播放?
【解决方案2】:

要立即播放,您可以尝试设置

player.automaticallyWaitsToMinimizeStalling = false

【讨论】:

  • 对我不起作用,AVPlayer 仍然是先下载整个视频然后开始播放:(
  • 这个解决方案没有解决问题
  • 当我添加上面一行 avplayer 下载整个视频然后开始播放
  • 如果我们保持自动WaitsToMinimizeStalling 为真,播放远程 url 需要大量时间。那么,使用它有什么好处呢?我知道它解决了什么目的,但加载时间增加了,这使我们将其设置为 false。
猜你喜欢
  • 2011-09-24
  • 2012-01-18
  • 2012-10-19
  • 1970-01-01
  • 1970-01-01
  • 2014-05-09
  • 2011-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多