Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用avplayer-ios swift播放AES加密的hls流_Ios_Swift_Aes_Avplayer_Http Live Streaming - Fatal编程技术网

使用avplayer-ios swift播放AES加密的hls流

使用avplayer-ios swift播放AES加密的hls流,ios,swift,aes,avplayer,http-live-streaming,Ios,Swift,Aes,Avplayer,Http Live Streaming,我正在尝试在AVPlayer中播放AES加密流。。通常,键的链接会传送到M3U8播放列表中的播放器。。在我的场景中,钥匙被一分为二。。前半部分由服务器提供,我应该在应用程序中附加另一半,以便在播放时解密 我已经在Android上做过了,有没有办法也在iOS上做呢 这是播放列表: 这是块列表: 这就是AVPlayer所做的: 1-下载播放列表并选择区块列表 2-玩家下载区块列表 3-下载用于解密区块的解密密钥 4-玩家开始按顺序下载区块以播放它们 5-每个区块都被解密并播放 我需要做的是:

我正在尝试在AVPlayer中播放AES加密流。。通常,键的链接会传送到M3U8播放列表中的播放器。。在我的场景中,钥匙被一分为二。。前半部分由服务器提供,我应该在应用程序中附加另一半,以便在播放时解密

我已经在Android上做过了,有没有办法也在iOS上做呢

这是播放列表:

这是块列表:

这就是AVPlayer所做的:

1-下载播放列表并选择区块列表 2-玩家下载区块列表 3-下载用于解密区块的解密密钥 4-玩家开始按顺序下载区块以播放它们 5-每个区块都被解密并播放

我需要做的是: 在第三步之后,当播放器使用以下链接调用api以获取加密密钥:“”,我想截获响应并附加密钥的另一半


可能吗?

是的,非常可能!我最近在我的一个项目中这样做了

每当
AVPlayer
加载加密视频时,它都会尝试从prog_index.m3u8中提到的URL加载解密密钥。如果AVPlayer无法使用提取的密钥播放视频,或者在指定的url上根本没有获取密钥,它将从
AVAssetResourceLoaderDelegate
调用委托方法,即

 public func resourceLoader(_ resourceLoader: AVAssetResourceLoader, shouldWaitForRenewalOfRequestedResource renewalRequest: AVAssetResourceRenewalRequest) -> Bool {
    return shouldLoadOrRenewRequestedResource(resourceLoadingRequest: renewalRequest)
}
以及

当然,它们在被调用的情况下有所不同。当玩家需要等待加载资源时调用前一个,当玩家需要更新资源时调用后一个

func shouldLoadOrRenewRequestedResource(resourceLoadingRequest: AVAssetResourceLoadingRequest) -> Bool {

    guard var url = resourceLoadingRequest.request.url else {
        return false
    }

   //FETCH THE KEY FROM NETWORK CALL/KEYSTORE, CONVERT IT TO DATA AND FINISH LOADING OF RESOURCE WITH THAT DATA, IN YOUR CASE JOIN THE OTHER HALF OF THE KEY TO ACTUAL KEY (you can get the first half from the url above)
   resourceLoadingRequest.dataRequest?.respond(with: keyData)
   resourceLoadingRequest.finishLoading()

    return true;
}}

一旦您使用实际键返回true,视频将立即播放。

您在Android中是如何做到的?请分享一些Android的示例代码。我已经在iOS中完成了,但仍然坚持Android@Vashum是的,我在安卓上做过,你在安卓上用的是什么视频播放器?EXO player,你能帮忙吗?任何示例代码都会很好,你能帮我吗?嗨@HadiNajem,你能分享你的Android自定义数据源代码吗?因为我一直在Android上实现这一点。
 public func resourceLoader(_ resourceLoader: AVAssetResourceLoader, shouldWaitForRenewalOfRequestedResource renewalRequest: AVAssetResourceRenewalRequest) -> Bool {
    return shouldLoadOrRenewRequestedResource(resourceLoadingRequest: renewalRequest)
}
public func resourceLoader(_ resourceLoader: AVAssetResourceLoader, shouldWaitForLoadingOfRequestedResource loadingRequest: AVAssetResourceLoadingRequest) -> Bool {
    return shouldLoadOrRenewRequestedResource(resourceLoadingRequest: loadingRequest)
}
func shouldLoadOrRenewRequestedResource(resourceLoadingRequest: AVAssetResourceLoadingRequest) -> Bool {

    guard var url = resourceLoadingRequest.request.url else {
        return false
    }

   //FETCH THE KEY FROM NETWORK CALL/KEYSTORE, CONVERT IT TO DATA AND FINISH LOADING OF RESOURCE WITH THAT DATA, IN YOUR CASE JOIN THE OTHER HALF OF THE KEY TO ACTUAL KEY (you can get the first half from the url above)
   resourceLoadingRequest.dataRequest?.respond(with: keyData)
   resourceLoadingRequest.finishLoading()

    return true;
}}