将本地加密视频文件Asset加载到AVPlayer中

时间:2018-06-14 12:57:15

标签: ios avplayer avplayerviewcontroller

我想尝试从加密的"视频中读取数据"文件,解密数据并使其在AVPlayer上运行。

我的应用可以下载视频,视频从我的API加密。我所要做的就是:用一个密码解密文件,然后它变成一个有效的mp4文件。

涵盖了这些步骤。我完成了这个过程并将解密后的数据写入文件中,在我的机器上播放并将文件URL传递给AVPlayer并播放。

但是,我不想保存解密文件。我做了一些研究,并提出了AVAssetResourceLoaderDelegate。试图实施它但没有成功。我看到的例子是点击在线网址,所以我不能完全确定它是否可以在我尝试的时候在本地进行。

任何人都可以帮助我吗?

        guard var components = URLComponents.init(url: video.url, resolvingAgainstBaseURL: false) else { return }
        components.scheme = "encryptedVideo"
        guard let url = components.url else { return }

        let asset = AVURLAsset(url: fileDecryptedURL)
        asset.resourceLoader.setDelegate(self, queue: DispatchQueue.global(qos: .background))
        let playerItem = AVPlayerItem(asset: asset)
        let player = AVPlayer(playerItem: playerItem)
        player.actionAtItemEnd = .none
        self.avPlayerViewController?.player = player
        self.avPlayerViewController?.player?.play()

func resourceLoader(_ resourceLoader: AVAssetResourceLoader, shouldWaitForLoadingOfRequestedResource loadingRequest: AVAssetResourceLoadingRequest) -> Bool {
    if let dataRequest = loadingRequest.dataRequest,
        let url = loadingRequest.request.url,
        let contentRequest = loadingRequest.contentInformationRequest {

        guard var components = URLComponents.init(url: url, resolvingAgainstBaseURL: false) else { return false }
        components.scheme = "file"
        guard let localUrl = components.url else { return false }

        let storageProvider = StorageVideo()
        let dataMaybe = storageProvider.videoData(url: localUrl)

        guard let encryptedData = dataMaybe,
            let decryptedData = try? RNCryptor.decrypt(data: encryptedData,
                                                       withPassword: "omitted") else {
            return false
        }

        contentRequest.contentType = AVFileType.mp4.rawValue
        contentRequest.contentLength = Int64(decryptedData.count)
//            contentRequest.isByteRangeAccessSupported = true

        dataRequest.respond(with: decryptedData)
        loadingRequest.finishLoading()

// Did this to save the file to see if it was ok. I could play the file in my machine 
// If I pass this file url to a asset (above step) it load as well
//            if let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
//                let fileDecryptedURL = documentDirectory.appendingPathComponent("test").appendingPathExtension("mp4")
//                try? decryptedData.write(to: fileDecryptedURL)
//            }
    }
    return true
}

0 个答案:

没有答案