ドキュメントには、AVURLAsset.resourceLoader について次のように記載されています。
読み込み中、リソース ローダー オブジェクトは、リソースの読み込みを支援するように求められる場合があります。たとえば、復号化が必要なリソースでは、リソース ローダーが適切な復号化キーを提供するよう求められる場合があります。デリゲート オブジェクトをリソース ローダー オブジェクトに割り当て、デリゲートを使用してこれらの要求をインターセプトし、適切な応答を提供できます。
したがって、コードでやろうとしていることは次のとおりです。
NSURL* url = ...;
_asset = [[AVURLAsset alloc] initWithURL:url options:nil];
AVAssetResourceLoader* loader = _asset.resourceLoader;
[loader setDelegate:self queue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)];
_playerItem = [AVPlayerItem playerItemWithAsset:_asset];
_player = [AVPlayer playerWithPlayerItem:_playerItem];
// ... setting up the player layer
[_player play];
また、私のクラスでは、AVAssetResourceLoaderDelegate を @interface に追加し、メソッドも実装します。
- (BOOL)resourceLoader:(AVAssetResourceLoader *)resourceLoader shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest *)loadingRequest
{
NSLog(@"YES");
return YES;
}
どのような URL が渡されても、このメソッドが呼び出されることはありません。URL が HTTP 経由の有効なメディアであるか、カスタム登録された NSURLProtocol を使用しているかどうかは問題ではありません。
resourceLoader はいつデリゲートを呼び出すと想定していますか?