Ssl 带有resourceLoader委托的AVPlayer获取数据但不播放视频

Ssl 带有resourceLoader委托的AVPlayer获取数据但不播放视频,ssl,swiftui,avplayer,urlsession,avurlasset,Ssl,Swiftui,Avplayer,Urlsession,Avurlasset,这是我在这个网站上第一次请求帮助。我搜索了整个互联网,尝试了很多东西,甚至阅读了文档:),但我找不到解决问题的方法 我的任务是播放需要证书的存储库中的视频。如果我使用简单的AVPlayer设置,而不设置AVAssetResourceLoaderDelegate: controller.player = AVPlayer(url: urlFromUnprotectedPlace) 播放器完美地从未受保护的存储器中打开URL并播放视频。但在尝试播放受保护文件夹中的视频时,会出现错误:“此服务器的证

这是我在这个网站上第一次请求帮助。我搜索了整个互联网,尝试了很多东西,甚至阅读了文档:),但我找不到解决问题的方法

我的任务是播放需要证书的存储库中的视频。如果我使用简单的AVPlayer设置,而不设置AVAssetResourceLoaderDelegate:

controller.player = AVPlayer(url: urlFromUnprotectedPlace)
播放器完美地从未受保护的存储器中打开URL并播放视频。但在尝试播放受保护文件夹中的视频时,会出现错误:“此服务器的证书无效”。通过设置resourceLoader委托可以解决此问题:

let asset = AVURLAsset(url: customSchemeUrl)
asset.resourceLoader.setDelegate(myDelegate, queue: .main)
let item = AVPlayerItem(asset: asset)
controller.player = AVPlayer(playerItem: item)
以及委托方法本身:

func resourceLoader(
        _ resourceLoader: AVAssetResourceLoader,
        shouldWaitForLoadingOfRequestedResource loadingRequest: AVAssetResourceLoadingRequest
    ) -> Bool {
        guard let url = url else {
            logger.log("nil url")
            return false
        }
        var request = URLRequest(url: url)
        request.httpMethod = "GET"
        request.setValue("bytes=0-", forHTTPHeaderField: "Range")
        
        let sessionTask = urlSession?.dataTask(with: request) { [weak self] data, response, error in
            if let error = error {
                self?.logger.log(error.localizedDescription)
                return
            }
            loadingRequest.contentInformationRequest?.contentType = AVFileType.mp4.rawValue
            loadingRequest.contentInformationRequest?.isByteRangeAccessSupported = true
            loadingRequest.response = response
            if let data = data {
                loadingRequest.contentInformationRequest?.contentLength = Int64(data.count)
                loadingRequest.dataRequest?.respond(with: data)
            }
            loadingRequest.finishLoading()
        }
        sessionTask?.resume()
        return true
    }
数据和响应出现时,错误为零。数据大小正确。响应包含状态206。播放器的项目有一个状态观察者,但没有人显示任何错误-播放器只是黑色的,下载轮正在旋转。

但我更进一步。有这样一个项目: 我用他的代理人代替了我的代理人——同样的行为。但它还可以将下载的数据保存到本地文件中。因此,如果保存完成后尝试播放此文件-一切正常,则播放该文件

我的SwiftUI播放器:

final class MyVideoPlayer: UIViewControllerRepresentable {
    private let controller = AVPlayerViewController()
    private var playerItemObserver: MyPlayerItemStateObserver?
    private var resourceLoaderDelegate: EugeneResourceLoaderDelegate?
    
    private var playingStarted = false
    
    init(url: URL?) {
        guard let url = url else { return }
        resourceLoaderDelegate = EugeneResourceLoaderDelegate(withURL: url)
        resourceLoaderDelegate?.completion = downloadCompletion()
        controller.player = createPlayer()
    }
    
    func makeUIViewController(context: Context) -> AVPlayerViewController {
        controller
    }

    func updateUIViewController(_ uiViewController: AVPlayerViewController, context: Context) {}
    
    func play() -> some View {
        playingStarted = true
        controller.player?.play()
        return self
    }
}

extension MyVideoPlayer {
    private func createPlayer() -> AVPlayer? {
        guard
            let delegate = resourceLoaderDelegate,
            let streamingUrl = delegate.streamingAssetURL
        else {
            return nil
        }
        let asset = AVURLAsset(url: streamingUrl)
        asset.resourceLoader.setDelegate(delegate, queue: .main)
        playerItemObserver = MyPlayerItemStateObserver(asset: asset, logger: logger)
        if let item = playerItemObserver?.item {
            return AVPlayer(playerItem: item)
        }
        return nil
    }
    
    private func downloadCompletion() -> (URL?) -> Void {
        { [weak self] localFileURL in
            guard let self = self else { return }
            guard let localFileURL = localFileURL else {
                print("Failed to download media file.")
                return
            }
            print("Media file saved to: \(localFileURL)")
            let status = self.controller.player?.timeControlStatus
            if self.playingStarted && status?.rawValue == 1 {
                self.controller.player = AVPlayer(url: localFileURL)
                self.controller.player?.play()
            }
        }
    }
}
我想我已经没有主意了。如果有任何帮助,我将不胜感激

Upd。在重新创建播放器以播放本地文件之前,我打印了播放器的状态及其当前项,得到了以下结果:

player?.reasonForWaitingToPlay - AVPlayerWaitingWhileEvaluatingBufferingRateReason
player?.currentItem?.isPlaybackBufferEmpty - true
player?.currentItem?.duration - value: 0

你找到解决办法了吗?