以块为单位解密媒体文件并通过AVPlayer播放

我有一个mp4 video file ,我正在encrypting以保存和decrypting通过AVPlayer播放。 Using CRYPTOSWIFT Library for encrypting/decrypting

当我一次解密整个文件但我的文件相当大并且占用100%的CPU和大量内存时,它工作正常。 所以,我需要以块的forms解密加密文件。 我尝试以块的forms解密文件,但由于AVPlayer无法识别解密的块数据,因此可能无法在加密文件时按顺序存储数据。 我已经尝试过chacha20, AES, AES.CTR & AES.CBC协议来加密和解密文件,但无济于事。

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

解码代码以解码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 } 

我需要有关此问题的帮助,请指导我以正确的方式实现这一目标。