簡體   English   中英

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

[英]Playing AES encrypted hls stream using avplayer - ios swift

我正在嘗試在 AVPlayer 中播放 AES 加密流。通常,密鑰的鏈接會傳遞給 M3U8 播放列表中的播放器。在我的場景中,密鑰被分成兩半。前半部分由服務器傳遞我應該在應用程序中附加另一半以在播放時解密

我已經在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

這是塊列表:

 #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- 下載播放列表並選擇塊列表 2- 播放器下載塊列表 3- 下載解密塊的解密密鑰 4- 播放器開始按順序下載塊以播放它們 5- 每個塊都被解密並且玩過

我需要做的是:在玩家調用 api 以使用此鏈接獲取加密密鑰的第三步之后:' http : //example.com/api/getEncryptionKey?t=57b5b16d3824d ',我想攔截響應並附加密鑰的另一半

是否可以?

是的,這是非常可能的! 我最近在我的一個項目中做過。

每當AVPlayer加載加密視頻時,它都會嘗試從prog_index.m3u8中提到的URL加載解密密鑰。 如果AVPlayer無法使用獲取的密鑰播放視頻,或者如果它未在指定的URL上獲取密鑰,則它會調用AVAssetResourceLoaderDelegate中的委托方法,即

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

一旦您使用實際密鑰返回true,視頻將立即播放。

在嘗試使用 Azure 媒體服務時,以下示例可以正常工作。 在這里,我們將令牌添加為 AVURLAsset 選項的一部分。

    var options = [String: [String: String]]()
    if (!token.isEmpty) {
        let headers = ["Authorization": "Bearer " + token!]
        options = ["AVURLAssetHTTPHeaderFieldsKey": headers]
    }
    let avAsset = AVURLAsset(url: videoUrl, options: options)
    let avItem = AVPlayerItem(asset: avAsset)
    let player = AVPlayer(playerItem: avItem)
    
    let playerFrame = view.viewWithTag(1)?.frame
    controller.player = player
    if (autoPlay.isOn) {
        player.rate = 1
    }
    controller.view.frame = playerFrame ?? CGRect(x: 0, y: 0, width: view.frame.width , height: 250)
    addChild(controller)
    view.viewWithTag(1)?.addSubview(controller.view)
    controller.didMove(toParent: self)
    

完整的工作樣本可以從

https://github.com/Azure-Samples/media-services-3rdparty-player-samples/tree/master/src/avplayer

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM