2016-08-24 11 views
2

AVPlayerでAES暗号化ストリームを再生しようとしています。通常、キーのリンクがM3U8プレイリスト内のプレーヤーに配信されます。半分に分割..サーバーで前半が配信され、再生時に解読するためにアプリケーション内の残りの半分を追加する必要がありますavplayer - ios swiftを使用してAES暗号化hlsストリームを再生する

すでに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-チャンクリストは、プレイヤーが はチャンクを復号化するための復号鍵がダウンロードされ、3- 、4-プレイヤーが始まるチャンクのリストをダウンロードし 2 - 選択されています 5すべてのチャンクを復号化し、私がする必要がどのような

を果たしているそれらを再生するために順次チャンクをダウンロードする次のとおりです。 第三ステップの後にプレイヤーがこのリンクを使用して暗号化キーを取得するためのAPIを呼び出すとき:「http://example.com/api/getEncryptionKey?t=57b5b16d3824d」 、私は応答を傍受し、キーの他の半分を追加したい

可能でしょうか?

答えて

0

はい、非常に可能です!私は最近、私のプロジェクトの一つでそれをやった。

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を返すと、ビデオは即座に再生されます。

関連する問題