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

标签 ios swift aes avplayer http-live-streaming

我正在尝试在 AVPlayer 中播放 AES 加密流。通常, key 链接会传送到 M3U8 播放列表中的播放器。在我的场景中, key 被分成两半。前半部分已传送通过服务器,我应该将另一半附加到应用程序中以在播放时解密

我已经在 Android 上完成了这个,有没有办法在 iOS 上也这样做?

这是播放列表:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:BANDWIDTH=200000,RESOLUTION=284x160
chunklist_w670540365_b200000.m3u8?t=57b5b16d3824d
#EXT-X-STREAM-INF:BANDWIDTH=850000,RESOLUTION=640x360
chunklist_w670540365_b850000.m3u8?t=57b5b16d3824d

这是 block 列表:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-ALLOW-CACHE:NO
#EXT-X-TARGETDURATION:11
#EXT-X-MEDIA-SEQUENCE:13544
#EXT-X-KEY:METHOD=AES-128,URI="http://example.com/api/getEncryptionKey?t=57b5b16d3824d"
#EXTINF:9.6,
media_w670540365_b200000_13544.ts?t=57b5b16d3824d
#EXTINF:9.6,
media_w670540365_b200000_13545.ts?t=57b5b16d3824d
#EXTINF:10.56,
media_w670540365_b200000_13546.ts?t=57b5b16d3824d

这就是 AVPlayer 所做的:

1- 下载播放列表并选择 block 列表 2- 玩家下载区 block 列表 3- 解密 block 的解密 key 已下载 4- 播放器开始按顺序下载 block 来播放它们 5-每个 block 都被解密和播放

我需要做的是: 在播放器调用 api 以使用此链接获取加密 key 的第 3 步之后:' http://example.com/api/getEncryptionKey?t=57b5b16d3824d ', 我想拦截响应并附加另一半 key

这可能吗?

最佳答案

是的,很有可能!我最近在我的一个项目中这样做了。

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

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

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

关于ios - 使用 avplayer 播放 AES 加密的 hls 流 - ios swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39124793/

相关文章:

ios - Apple Watch 应用程序在 iOS 8.2 上被删除后不会重新安装,只是卡在启动屏幕上

ios - 滚动 UITableView 时隐藏键盘

ios - 在 MapBox Android 和 iOS 上显示 GeoJSON

ios - 检测 uislider 拇指拖动方向 swift 3

java - 如何使用 Java 从 CryptoJS 解密加密的 AES-256 字符串?

mysql - CF8和AES解密MySQL AES : encodings are not same

c++ - 如何在 C++ 中向 BYTE 数组添加填充?

ios - 如何获取 tableView 部分标题

ios - Swift:设置委托(delegate)

ios - 如何显示用户定义的位置