使用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。
您可以尝试将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"); } } }