Descifrar files de medios en trozos y jugar a través de AVPlayer

Tengo un mp4 video file que estoy encrypting para save y decrypting para reproducir a través de AVPlayer. Using CRYPTOSWIFT Library for encrypting/decrypting

Funciona bien cuando descifro un file integer a la vez, pero mi file es bastante grande y consume 100% de CPU y mucha memory. Por lo tanto, necesito descifrar el file encriptado en trozos. Intenté descifrar el file en fragments, pero no reproduce video ya que AVPlayer no reconoce los datos desencryptions de fragments, tal vez los datos no se almacenan secuencialmente mientras se encripta el file. He probado los chacha20, AES, AES.CTR & AES.CBC para cifrar y descifrar files, pero en vano.

 extension PlayerController: AVAssetResourceLoaderDelegate { func resourceLoader(resourceLoader: AVAssetResourceLoader, shouldWaitForLoadingOfRequestedResource loadingRequest: AVAssetResourceLoadingRequest) -> Bool { let request = loadingRequest.request guard let path = request.URL?.path where request.URL?.scheme == Constants.customVideoScheme else { return true } if let contentRequest = loadingRequest.contentInformationRequest { do { let fileAttributes = try NSFileManager.defaultManager().attributesOfItemAtPath(path) if let fileSizeNumber = fileAttributes[NSFileSize] { contentRequest.contentLength = fileSizeNumber.longLongValue } } catch { } if fileHandle == nil { fileHandle = NSFileHandle(forReadingAtPath: (request.URL?.path)!)! } contentRequest.contentType = "video/mp4" contentRequest.byteRangeAccessSupported = true } if let data = decryptData(loadingRequest, path: path), dataRequest = loadingRequest.dataRequest { dataRequest.respondWithData(data) loadingRequest.finishLoading() return true } return true } func decryptData(loadingRequest: AVAssetResourceLoadingRequest, path: String) -> NSData? { print("Current OFFSET: \(loadingRequest.dataRequest?.currentOffset)") print("requested OFFSET: \(loadingRequest.dataRequest?.requestedOffset)") print("Current Length: \(loadingRequest.dataRequest?.requestedLength)") if loadingRequest.contentInformationRequest != nil { var data = fileHandle!.readDataOfLength((loadingRequest.dataRequest?.requestedLength)!) fileHandle!.seekToFileOffset(0) data = decodeVideoData(data)! return data } else { fileHandle?.seekToFileOffset(UInt64((loadingRequest.dataRequest?.currentOffset)!)) let data = fileHandle!.readDataOfLength((loadingRequest.dataRequest?.requestedLength)!) // let data = fileHandle!.readDataOfLength(length!) ** When I use this its not playing video but play fine when try with requestedLength ** return decodeVideoData(data) } } } 

Decodificar el código para decodificar nsdata:

  func decodeVideoData(data: NSData) -> NSData? { if let cha = ChaCha20(key: Constants.Encryption.SecretKey, iv: Constants.Encryption.IvKey) { let decrypted: NSData = try! data.decrypt(cha) return decrypted } return nil } 

Necesito ayuda con respecto a este problema, por favor, guíame a la forma correcta de lograr esto.