Objective c TvOS AVQueuePlayer缓冲问题

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

我有一个TvOS应用程序,可以使用
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
具有一些相互矛盾的属性值。它说当它暂停和恢复时,它的缓冲区是空的,但它已经准备好播放了。。。当我计算缓冲区时,它看起来已经缓冲了整首歌


这个问题到底是什么?为什么会发生?

我看到了一个类似的问题,我还没有解决这个问题。有更新吗?没有,我停止了这个项目的工作。我看到了一个类似的问题。我还没有解决这个问题。有更新吗?没有,我停止了这个项目的工作