感谢这两个帖子,我在创建 AVPLayerItem AVQueuePlayer 播放期间解决了这个问题,没有间隙并冻结 AVPlayer 在缓冲音频流开始时“冻结”应用程序
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:[NSURL URLWithString:urlString] options:@{AVURLAssetPreferPreciseDurationAndTimingKey : @(YES)}];
NSArray *keys = @[@"playable", @"tracks",@"duration" ];
[asset loadValuesAsynchronouslyForKeys:keys completionHandler:^()
{
for (NSString *thisKey in keys) {
NSError *error = nil;
AVKeyValueStatus keyStatus = [asset statusOfValueForKey:thisKey error:&error];
if (keyStatus == AVKeyValueStatusFailed) {
return ;
}
}
AVPlayerItem *item = [[AVPlayerItem alloc] initWithAsset:asset];
dispatch_async(dispatch_get_main_queue(), ^ {
[item addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
[player insertItem:item afterItem:nil];
});
}];
});
但是,使用来自 Soundcloud 的流(https://api.soundcloud.com/tracks/146924238/stream?client_id=76395c48f97de903ff44861e230116bd),在项目的状态准备好播放(AVPlayerStatusReadyToPlay)之后,AVQueueplayer 继续在主线程中执行某些操作“冻结” UI(跟踪在后台线程中继续播放)。
我注意到当网络较低时这个问题更重要,然后我得出结论,当项目缓冲流时存在这种冻结。
有人有解决方案或技巧吗?