これらの 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 を「フリーズ」します (トラックはバックグラウンド スレッドで再生を続けます)。
ネットワークが低い場合、この問題がより重要であることに気付きました。その後、アイテムがストリームをバッファリングしているときにこのフリーズが存在するという結論に達しました。
誰かが解決策またはトリックを持っていますか?