我一直试图在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进行测试(结果似乎是相同的)。
我已经验证了所有的代码都是在主线程上执行的,就像我在this question中看到的那样,所有的东西都必须在同一个线程上。
有没有人有任何建议,或者对某些可用的源代码的引用,而这个委托实际上是在其中被调用的?
更新:我已经确定,当url转到本地文件时,这段代码运行良好,但对于远程文件,它仍然不能工作。这是预期的行为,还是我可以对远程文件这样做?
发布于 2015-04-29 18:05:36
只有当我们使用“非标准/非保留”url方案时,AVAssetResourceLoaderDelegate才能工作。HTTP、HTTPS等被认为是保留的URL方案,如果url有这些方案之一,iOS将不会进行委托调用。我最后所做的是使用my_own_http作为http,my_own_https用于https urls。效果很好。还有一件事要记住,如果您有带有非标准方案的URL,它可能无法在其他支持HLS的设备上工作。
https://stackoverflow.com/questions/26372141
复制相似问题