文档说明了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何时会调用其委托?
您应该尝试使用自定义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)
| 归档时间: |
|
| 查看次数: |
5043 次 |
| 最近记录: |