2

尝试设置 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 委托设置正确,但它永远不会被调用。

我将不胜感激。

谢谢, 迈克尔

4

0 回答 0