使用 AVPlayer 进行流式传输很慢
Using AVPlayer for streaming is slow
我使用 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。
您可以在 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");
}
}
}
立即播放可以尝试设置
player.automaticallyWaitsToMinimizeStalling = false
我使用 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。
您可以在 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");
}
}
}
立即播放可以尝试设置
player.automaticallyWaitsToMinimizeStalling = false