如何使用AVAssetResourceLoader?

Dmi*_*try 7 avfoundation ios

文档说明了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];
Run Code Online (Sandbox Code Playgroud)

我在课堂上将AVAssetResourceLoaderDelegate添加到@interface并实现方法:

- (BOOL)resourceLoader:(AVAssetResourceLoader *)resourceLoader shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest *)loadingRequest
{
    NSLog(@"YES");
    return YES;
}
Run Code Online (Sandbox Code Playgroud)

无论传递什么URL,都不会调用此方法.如果URL是HTTP上的有效媒体,或使用我的自定义注册NSURLProtocol,则不会满足.

resourceLoader何时会调用其委托?

Bog*_*dan 9

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


小智 0

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

AVAssetResourceLoader* resource_loader = [some_AVAsset resourceLoader];
[resource_loader setDelegate:your_resource_data_loader queue:your_dispatch_queue];
Run Code Online (Sandbox Code Playgroud)