7

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

4

2 回答 2

9

您应该尝试使用自定义 URL 方案,例如:而不是http://myserver.com/listen.m3u使用my_custom_scheme://myserver.com/listen.m3u. 默认情况下,HTTP 和 HTTPS 由 Apple 处理,因此不会调用委托。要绕过这一点,您需要使用自定义方案来强制调用委托方法。

于 2015-05-10T18:09:54.527 回答
-1

您可能需要替换 resourceLoader ,例如:

AVAssetResourceLoader* resource_loader = [some_AVAsset resourceLoader];
[resource_loader setDelegate:your_resource_data_loader queue:your_dispatch_queue];
于 2014-07-10T09:34:36.320 回答