6

これらの 2 つの投稿のおかげで、 AVPLayerItem の作成中にこの問題を解決 できます。

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