AVAssetResourceLoaderDelegate方法不能在设备上工作

我一直在研究一个简单的AVPlayer来播放encryption的HLS媒体。

我正在使用AVAssetResourceLoaderDelegate处理密钥检索过程,因此可以使用有效的密钥来播放encryption的媒体。

该程序完美地在模拟器上工作,但在设备上完全不起作用

这里是代码:

 - (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]; } 

经过一些debugging,我意识到委托方法shouldWaitForLoadingOfRequestedResource从未在设备上调用。

我已阅读其他相关问题:

AVAssetResourceLoaderDelegate没有被调用

AVAssetResourceLoaderDelegate – 只请求前两个字节?

我试着把所有的代码放在dispatch_asyncdispatch_get_main_queue块中,但是解决我的问题没有任何运气。

目前我的代码不包含任何调度队列块。

对这个问题有什么想法?

如果你看看苹果示例代码,他们显示bipbop.m3u8 HLS播放,你会看到他们使用真正的http请求掩码:“http:/host/bipbop.m3u8”=>“custom_scheme:/主机/ bipbop。 m3u8“与播放列表子资源一样,

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

你需要实现某种映射:

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

正如我在其他线程中所提到的,AVAssetResourceLoaderDelegate只在我们使用“非标准/非保留”URLscheme时才起作用。 HTTP,HTTPS等被认为是保留的URLscheme,如果URL有这些scheme之一,iOS将不会进行委托调用。 我最终做的是使用my_own_http为http url和my_own_https为httpsurl。 在我做出这个改变之后,它运作良好。 如您所知,这会使您的播放列表无法在其他设备上使用。

在您的委托中, shouldWaitForLoadingOfRequestedResource将URLscheme更改回http:

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