带有Soundcloud流项的AVQueuePlayer(或AVPlayer)阻止UI(主线程)

Dam*_*ito 6 objective-c freeze soundcloud avplayer avqueueplayer

感谢这两篇文章,我在创建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];

         });

     }];
});
Run Code Online (Sandbox Code Playgroud)

但是,使用来自Soundcloud的流(https://api.soundcloud.com/tracks/146924238/stream?client_id=76395c48f97de903ff44861e230116bd),在项目状态准备好播放(AVPlayerStatusReadyToPlay)之后,AVQueueplayer继续在主线程中执行某些操作"冻结"UI(跟踪继续在后台线程中播放).

我注意到这个问题在网络较低时更为重要,然后我得出结论,当项目缓冲流时,此冻结存在.

有人有解决方案或诀窍吗?