使用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()移动到观察者,附加到项目的状态属性
  • 使用属性preferredForwardBufferDurationpreferredPeakBitRate来玩

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

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

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

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