针对 HTTPS 的 AVPlayer URL 自定义加载



我正在尝试将AVPlayer与自定义URL加载(自定义NSURLProtocol子类(一起使用。 但似乎[NSURLProtocol registerClass]不适用于真实设备中的 AVPlayer(请参阅此线程(。

现在我正在尝试使用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"的方案,则AVPlayerAVAssetResourceLoader会忽略委托。

是的,解决方法是将 URL 方案替换为一些自定义方案,并在获取数据时将其替换回委托回调中。

- (BOOL) resourceLoader:(AVAssetResourceLoader *)resourceLoader
shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest *)loadingRequest

网址字符串loadingRequest.request.URL.absoluteString

最新更新