如何使用AVAssetResourceLoader?

时间:2013-08-13 09:38:13

标签: ios avfoundation

文档说明了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何时会调用其委托?

2 个答案:

答案 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];