AVPlayer在线模式下停止播放AESencryption离线HLSvideo

我写了一个代码来下载HLSvideo并以离线模式播放。 此代码适用于编码的video。 现在我有一个AESencryption的video,我们正在为它定制encryption密钥。 下载AESencryption的HLSvideo后,我使用下面给出的代码来提供解密video的密钥。

- (BOOL)resourceLoader:(AVAssetResourceLoader *)resourceLoader shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest *)loadingRequest { NSString *scheme = loadingRequest.request.URL.scheme; if ([scheme isEqualToString:@"ckey"]) { NSString *request = loadingRequest.request.URL.host; NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:request]; if (data) { [loadingRequest.dataRequest respondWithData:data]; [loadingRequest finishLoading]; } else { // Data loading fail } } return NO; } 

我截获一个密钥的请求,并传递存储在UserDefaults中的密钥进行解密。

当我的设备的wifi或数据连接closures时,使用自定义密钥的AESencryptionHLSvideo播放效果良好。

如果我在启用设备的wifi或数据连接时开始播放此video,或者在播放video时启用设备的wifi或数据连接, video立即停止播放,没有任何错误,从不再播放。

我检查了playerItem的accessLog和errorLog,但没有发现任何有用的东西。

在下载HLS内容后提供自定义URL密钥我正在更新.m3u8文件的内容

URI = “…”

string与

URI = “CKEY:// …”

这是提供AESencryptionvideo密钥的正确方法吗?

这种行为的原因是什么?如何解决这个问题?

提前致谢。

最后我设法解决了这个问题。 下载的HLSvideo的粗糙的包结构如下所示:

 HLS.movpkg |_ 0-12345 |_ 123.m3u8 |_ StreamInfoBoot.xml |_ StreamInfoRoot.xml |_ <>.frag |_ boot.xml 
  1. boot.xml包含HLS的networkingURL(基于https:based)
  2. StreamBootInfo.xml包含HLS URL(基于https:based)和本地下载的.frag文件之间的映射。

在离线模式下,HLSvideo播放完美。 但是,当启用networking连接时,指的是https:URL而不是本地.frag文件。

我用自定义scheme(fakehttps :)取代了https:scheme,以限制AVPlayer上线资源。

这件事解决了我的问题,但我不知道背后的确切原因以及AVPlayer播放HLS的方式。

我提到这个,并得到了一些想法,所以试了一下。