文档说明了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何时会调用其委托?
答案 0 :(得分:9)
您应该尝试使用自定义网址方案,例如:而不是http://myserver.com/listen.m3u
使用my_custom_scheme://myserver.com/listen.m3u
。默认情况下,HTTP& HTTPS由Apple处理,因此不会调用委托。要绕过此操作,您需要使用自定义方案来强制调用委托方法。
答案 1 :(得分:-1)
您可能需要替换resourceLoader,如:
AVAssetResourceLoader* resource_loader = [some_AVAsset resourceLoader];
[resource_loader setDelegate:your_resource_data_loader queue:your_dispatch_queue];