尝试设置 AVAssetResourceLoaderDelegate 时遇到一个奇怪的问题。使用此代码时,它大部分时间都可以在设备上运行,但根本无法在模拟器上运行:
NSURL *url = [NSURL URLWithString:@"xxx://name"];
AVURLAsset *asset = [AVURLAsset assetWithURL:url];
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset];
[asset.resourceLoader setDelegate:self queue:self.queue];
AVPlayer *avPlayer = [AVPlayer playerWithPlayerItem:playerItem];
[avPlayer play];
问题是委托方法永远不会被调用:
- (BOOL)resourceLoader:(AVAssetResourceLoader *)resourceLoader shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest *)loadingRequest
但是,这段代码工作得很好:
NSURL *url = [NSURL URLWithString:@"xxx://name"];
AVURLAsset *asset = [AVURLAsset assetWithURL:url];
[asset.resourceLoader setDelegate:self queue:self.queue];
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset];
AVPlayer *avPlayer = [AVPlayer playerWithPlayerItem:playerItem];
[avPlayer play];
唯一的区别是我们先设置委托,然后使用资产创建 AVPlayerItem。在第一种情况下,创建 AVPlayerItem 时不会复制资产,如果我们检查 playerItem.asset.resourceLoader.delegate 委托设置正确,但它永远不会被调用。
我将不胜感激。
谢谢, 迈克尔