Ios AVAssetResourceLoaderDelegate方法在设备上不起作用

Ios AVAssetResourceLoaderDelegate方法在设备上不起作用,ios,avfoundation,Ios,Avfoundation,我一直在制作一个简单的AVPlayer来播放加密的HLS媒体 我正在使用AVAssetResourceLoaderDelegate处理密钥检索过程,以便使用有效密钥播放加密媒体 该程序在模拟器上运行良好,但在设备上根本无法运行 代码如下: - (void) playUrlByAVPlayer:(NSString *) videoUrl { NSURL *streamURL = [NSURL URLWithString:videoUrl]; AVURLAsset *asset =

我一直在制作一个简单的
AVPlayer
来播放加密的
HLS
媒体

我正在使用
AVAssetResourceLoaderDelegate
处理密钥检索过程,以便使用有效密钥播放加密媒体

该程序在模拟器上运行良好,但在设备上根本无法运行

代码如下:

- (void) playUrlByAVPlayer:(NSString *) videoUrl
{
    NSURL *streamURL = [NSURL URLWithString:videoUrl];

    AVURLAsset *asset = [AVURLAsset URLAssetWithURL:streamURL options:nil];

    [asset.resourceLoader setDelegate:self queue:dispatch_get_main_queue()];

    self.playerItem = [AVPlayerItem playerItemWithAsset:asset];                           
    self.player = [AVPlayer playerWithPlayerItem:self.playerItem];

    self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];
    [self.playerLayer setFrame:self.view.frame];
    [self.view.layer addSublayer:self.playerLayer];

    [self.player play];
}
经过一些调试后,我意识到委托方法
应该等待LoadingFrequestedResource
从未在设备上调用过

我阅读了其他相关问题:

我尝试将所有代码封装在
dispatch\u async
dispatch\u get\u main\u queue
块中,但解决我的问题运气不佳

目前,上述我的代码未包含在任何调度队列块中


对这个问题有什么想法吗?

如果你看一看苹果的示例代码,其中显示了bipbop.m3u8 HLS回放,你会发现他们正在使用掩码来处理真正的http请求:“http:/host/bipbop.m3u8”=>“custom_scheme:/host/bipbop.m3u8” 播放列表子资源也应该使用相同的技巧

否则,avplayer将忽略AVAssetResourceLoaderDelegate并直接加载数据

您需要实现某种映射:

NSString* videoUrl = @"fake_scheme://host/video.m3u8";
NSURL *streamURL = [NSURL URLWithString:videoUrl];

正如我在另一个线程中提到的,AVAssetResourceLoaderDelegate只有在使用“非标准/非保留”url方案时才起作用。HTTP、HTTPS等被视为保留URL方案,如果URL具有这些方案之一,iOS将不会进行委托调用。我最后做的是使用我自己的http作为http URL,使用我自己的https作为https URL。在我做了那个改变之后,它工作得很好。正如您所知,这会使您的播放列表无法在其他设备上使用。

在您的代理中
应等待加载频率资源
将URL方案更改回http:

NSURLComponents *urlComponents = [NSURLComponents componentsWithURL:loadingRequest.request.URL resolvingAgainstBaseURL:NO];
    urlComponents.scheme = @"http";
NSMutableURLRequest *mutableLoadingRequest = [loadingRequest.request mutableCopy];
[mutableLoadingRequest setURL:urlComponents.URL];

的确,会调用AVAssetResourceLoaderDelegate,但url几乎毫无用处。是否有任何方法可以在委托方法期间再次更改此url,使其实际工作?@nhenrique您是否成功地使用http更改自定义方案?由于loadingRequest是委托中的let常量,其request属性是get only属性。如果像my_own_http这样的方案无效,该如何工作?调用AVAssetResourceLoaderDelegate时是否删除此方案?如果是,您如何继续请求?@nhenrique您的代码应删除自定义方案并向服务器发出请求。您的委托代码充当代理。您解决了这个问题吗?下面的答案是正确的,但它只解释了如何触发代理。如何继续请求?我不确定在目标C中,但在Swift 3中,loadingRequest是let常量,loadingRequest.request是get-only属性。因此,更改将在复制版本上进行,而不是在主请求下进行。导致废话。@Rahul您找到了在swift中将URL方案更改回http的解决方案吗?