我一直试图在AVAssetResourceLoaderDelegate
协议上获取一些消息,但它似乎从未被调用。我已经验证了所有的事情都发生在主线程上;从创建AVURLAsset
,创建AVPlayerItem
,创建委托,委托队列设置为主线程。我正在尝试流式传输网络托管的MP4内容和未加密的HLS内容。
我的声明:
@property (readwrite, strong) AVPlayer* player;
@property (strong) AVPlayerItem* playerItem;
@property (strong) id<AVAssetResourceLoaderDelegate> resourceLoaderDelegate;
播放视频的代码:
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil];
...
self->_resourceLoaderDelegate = [[MyAssetResourceLoaderDelegate alloc] init];
[asset.resourceLoader setDelegate:self->_resourceLoaderDelegate
queue:dispatch_get_main_queue()];
...
self->_playerItem = [AVPlayerItem playerItemWithAsset:asset];
...
[self setPlayer:[AVPlayer playerWithPlayerItem:self->_playerItem]];
但是,resourceLoader:shouldWaitForLoadingOfRequestedResource:
永远不会被调用(其他任何委托方法也不会被调用)。
为了清晰起见,我正在使用iOS模拟器和运行iOS 8的iPhone 5s进行测试(结果似乎完全相同)。
我已经验证了所有的代码都是在主线程上执行的,正如我在这个问题中读到的那样,所有的代码必须在同一个线程上。
有人有什么建议吗,或者可能引用了一些可用的源代码,在这些代码中实际调用了该委托?
更新:我已经确定,当url指向本地文件时,此代码可以正常工作,但当它指向远程文件时,它仍然不工作。这是预期的行为吗?或者有没有一种方法可以为远程文件做到这一点?
AVAssetResourceLoaderDelegate仅在使用"非标准/非保留"url方案时有效。HTTP、HTTPS等被视为保留URL方案,如果URL具有其中一种方案,iOS将不会进行委托调用。我最终使用my_own_http作为http URL,使用my_oown_https作为https URL。它运行良好。还有一件事需要记住,如果你有非标准方案的URL,它可能无法在其他支持HLS的设备上工作。