6

感谢这两个帖子,我在创建 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(跟踪在后台线程中继续播放)。

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

有人有解决方案或技巧吗?

4

0 回答 0