我正在尝试将AVPlayer
与自定义URL加载一起使用(自定义NSURLProtocol
子类)。但似乎[NSURLProtocol registerClass]
在实际设备中无法与AVPlayer一起使用(请参阅此thread)。
现在我正在尝试使用AVAssetResourceLoaderDelegate
进行自定义URL加载。但是,这让我有点困惑如何触发委托。我处理的URL看起来像https://some_ip_address:port/resource/
,但似乎没有为该URL调用我的委托人。我试图将方案更改为非HTTP(例如“ quic”),并能够触发委托代码,但我真的不想破解该方案。
这里是相关代码:
(代理在另一个文件中实现)
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil];
AVAssetResourceLoader *resourceLoader = asset.resourceLoader;
[resourceLoader setDelegate:delegate
queue:dispatch_queue_create("MyURLDelegate loader", nil)];
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset];
AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem];
AVPlayerViewController *controller = [[AVPlayerViewController alloc] init];
controller.player = player;
[player play];
[self presentViewController:controller animated:false completion:^{}];
使用上述方法,如果url的方案为“ https”,则无法在委托中触发任何方法。我缺少允许委托为“ https” URL进行自定义URL加载的内容吗?
谢谢
仅在我现在解决问题时回答一个问题。简而言之,如果URL的方案为“ http”或“ https”,则AVPlayer
和AVAssetResourceLoader
将忽略委托。
是,解决方法是将URL方案替换为某些自定义方案,并在获取数据时将其替换回委托回调中。
- (BOOL) resourceLoader:(AVAssetResourceLoader *)resourceLoader
shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest *)loadingRequest
URL字符串为loadingRequest.request.URL.absoluteString