AVAssetResourceLoaderDelegate未被调用

7
我一直在尝试使用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指向本地文件时,此代码可以正常工作,但是当URL指向远程文件时,它仍无法正常工作。这是预期行为还是我可以以某种方式处理远程文件?


你能发布一下声明 _playerItem 和 _resourceLoaderDelegate 的代码吗? - Acey
我已经更新了上面的代码。另外,我已经确定如果URL指向本地文件,则会调用委托。有没有什么方法可以欺骗它调用委托? - MxSagan
你可能遇到了类似的问题:https://dev59.com/lYTba4cB1Zd3GeqP-Lue 这是我的答案。 - Chugaister
1个回答

9

只有当我们使用“非标准/非保留”URL方案时,AVAssetResourceLoaderDelegate才起作用。HTTP、HTTPS等被视为保留的URL方案,如果URL包含这些方案,iOS将不会调用代理。 我最终采取的方法是对于http URL使用my_own_http,对于https URL使用my_own_https。这个方法很有效。 还有一件事要记住,如果你有一个非标准方案的URL,它可能在支持HLS的其他设备上无法工作。


AVAssetResourceLoaderDelegate仅在使用“非标准/非保留”URL方案时才起作用。这似乎不是真的。我正在使用https用于密钥url,当它找不到m3u8播放列表中提到的密钥位置时,它总是被调用。但是,如果您没有连接到互联网,它将不会被调用。例如,在尝试从钥匙串或应用程序沙盒中获取密钥的持久化视频的情况下。 - abhinavroy23

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接