2016-08-24 6 views
2

Я пытаюсь воспроизвести зашифрованный поток AES в AVPlayer .. обычно ссылка ключа доставляется игроку внутри плейлиста M3U8 .. в моем сценарии ключ разделен на половину .. первая половина доставлена ​​сервером, и я должен добавить другую половину в приложении для дешифрования при игреВоспроизведение AES зашифрованного потока hls с помощью avplayer - ios swift

Я уже сделал это на 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- каждый кусок расшифровывается и играл

Что мне нужно сделать, это: после 3-го этапа, когда игрок называет апи, чтобы получить ключ шифрования по этой ссылке: «» http://example.com/api/getEncryptionKey?t=57b5b16d3824d , я хочу перехватить ответ и добавить вторую половину ключа

Возможно ли это?

ответ

0

да, очень возможно! Недавно я сделал это в одном из моих проектов.

Когда AVPlayer загружает зашифрованное видео, он пытается загрузить ключ дешифрования из URL-адреса, указанного в prog_index.m3u8. Если 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; 
}} 

Как только вы вернетесь с фактической клавишей, видео будет воспроизводиться мгновенно.