Objective c TvOS AVQueuePlayer缓冲问题
我有一个TvOS应用程序,可以使用Objective c TvOS AVQueuePlayer缓冲问题,objective-c,buffer,lag,tvos,avqueueplayer,Objective C,Buffer,Lag,Tvos,Avqueueplayer,我有一个TvOS应用程序,可以使用AVQueuePlayer播放音乐(歌曲存储在远程服务器上)。通常,这些歌曲会连续播放几个小时。有时候,它会在很短的时间内落后,然后继续比赛。但有些时候,它只是不断地滞后。当这种情况发生时,重新启动应用程序或重新启动苹果电视并不能解决问题 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(voi
AVQueuePlayer
播放音乐(歌曲存储在远程服务器上)。通常,这些歌曲会连续播放几个小时。有时候,它会在很短的时间内落后,然后继续比赛。但有些时候,它只是不断地滞后。当这种情况发生时,重新启动应用程序或重新启动苹果电视并不能解决问题
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if([keyPath isEqualToString:@"rate"] && object == queuePlayer) {
NSLog(@"rate: %@", @(queuePlayer.rate));
NSLog(@"duration: %@", @(CMTimeGetSeconds(queuePlayer.currentItem.duration)));
NSLog(@"time: %@", @(CMTimeGetSeconds(queuePlayer.currentItem.currentTime)));
NSLog(@"playbackLikelyToKeepUp: %@", @(queuePlayer.currentItem.playbackLikelyToKeepUp));
NSLog(@"playbackBufferEmpty: %@", @(queuePlayer.currentItem.playbackBufferEmpty));
NSLog(@"playbackBufferFull: %@", @(queuePlayer.currentItem.playbackBufferFull));
NSLog(@"bufferSize: %@", @([self bufferSize]));
double currentTime = CMTimeGetSeconds(queuePlayer.currentItem.currentTime);
if(queuePlayer.rate == 0 && currentTime != 0 && currentTime < CMTimeGetSeconds(queuePlayer.currentItem.duration) - 0.1) {
[queuePlayer prerollAtRate:1 completionHandler:^(BOOL finished) {
NSLog(@"Finished prerolling");
[queuePlayer play];
}];
}
}
}
- (NSTimeInterval) bufferSize {
NSArray *loadedTimeRanges = [[queuePlayer currentItem] loadedTimeRanges];
CMTimeRange timeRange = [[loadedTimeRanges objectAtIndex:0] CMTimeRangeValue];
Float64 startSeconds = CMTimeGetSeconds(timeRange.start);
Float64 durationSeconds = CMTimeGetSeconds(timeRange.duration);
NSTimeInterval result = startSeconds + durationSeconds;
return result;
}
我的应用程序没有延迟(仅播放播放器),苹果电视上的互联网连接非常完美(通过SpeedTest检查),远程服务器响应正常(我的计算机在缓冲文件时没有问题,ping非常快)
因此,我在我的AVQueuePlayer
的rate
属性上添加了一个观察者,以检查其currentItem
的一些属性,以获得有关问题的更多信息
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if([keyPath isEqualToString:@"rate"] && object == queuePlayer) {
NSLog(@"rate: %@", @(queuePlayer.rate));
NSLog(@"duration: %@", @(CMTimeGetSeconds(queuePlayer.currentItem.duration)));
NSLog(@"time: %@", @(CMTimeGetSeconds(queuePlayer.currentItem.currentTime)));
NSLog(@"playbackLikelyToKeepUp: %@", @(queuePlayer.currentItem.playbackLikelyToKeepUp));
NSLog(@"playbackBufferEmpty: %@", @(queuePlayer.currentItem.playbackBufferEmpty));
NSLog(@"playbackBufferFull: %@", @(queuePlayer.currentItem.playbackBufferFull));
NSLog(@"bufferSize: %@", @([self bufferSize]));
double currentTime = CMTimeGetSeconds(queuePlayer.currentItem.currentTime);
if(queuePlayer.rate == 0 && currentTime != 0 && currentTime < CMTimeGetSeconds(queuePlayer.currentItem.duration) - 0.1) {
[queuePlayer prerollAtRate:1 completionHandler:^(BOOL finished) {
NSLog(@"Finished prerolling");
[queuePlayer play];
}];
}
}
}
- (NSTimeInterval) bufferSize {
NSArray *loadedTimeRanges = [[queuePlayer currentItem] loadedTimeRanges];
CMTimeRange timeRange = [[loadedTimeRanges objectAtIndex:0] CMTimeRangeValue];
Float64 startSeconds = CMTimeGetSeconds(timeRange.start);
Float64 durationSeconds = CMTimeGetSeconds(timeRange.duration);
NSTimeInterval result = startSeconds + durationSeconds;
return result;
}
如您所见,currentItem
具有一些相互矛盾的属性值。它说当它暂停和恢复时,它的缓冲区是空的,但它已经准备好播放了。。。当我计算缓冲区时,它看起来已经缓冲了整首歌
这个问题到底是什么?为什么会发生?我看到了一个类似的问题,我还没有解决这个问题。有更新吗?没有,我停止了这个项目的工作。我看到了一个类似的问题。我还没有解决这个问题。有更新吗?没有,我停止了这个项目的工作