文档中提到了 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 什么时候应该调用它的委托?