我正在尝试将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"的方案,则AVPlayer
和AVAssetResourceLoader
会忽略委托。
是的,解决方法是将 URL 方案替换为一些自定义方案,并在获取数据时将其替换回委托回调中。
- (BOOL) resourceLoader:(AVAssetResourceLoader *)resourceLoader
shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest *)loadingRequest
网址字符串loadingRequest.request.URL.absoluteString