微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

iOS 离线 HLS DRM 受保护的内容每个应用程序会话只能播放一次

如何解决iOS 离线 HLS DRM 受保护的内容每个应用程序会话只能播放一次

正如标题所说,我只能复制下载的受 DRM 保护的内容一次。当我关闭播放器并返回时,它不再起作用,并且不再调用函数 resourceLoader(_ resourceLoader: AVAssetResourceLoader,shouldWaitForLoadingOfRequestedResource loadingRequest: AVAssetResourceLoadingRequest)。如果我杀死应用程序,它只会重新开始工作。

到目前为止我尝试过的:

  • 具有相同的 avplayer 实例来再现内容
  • 使用不同的 avplayer 实例来再现内容
  • 每个玩家会话具有相同的 AVAssetResourceLoaderDelegate 实例。
  • 每个玩家会话都有不同的 AVAssetResourceLoaderDelegate 实例。

这是我的代码的样子:


    public func load() {
        guard let source = source else { return }
        playerState.source = source

        let videoURL: URL
        if !source.Metadata.externalSubtitles.isEmpty {
            let localSchemaURL = source.url.absoluteString.replacingOccurrences(of: URLSchemas.https.rawValue,with: ExternalSubtitlesResourceLoader.mainScheme)
            videoURL = URL(string: localSchemaURL) ?? source.url
        } else {
            videoURL = source.url
        }
        self.resourceDelegate = Reachability.isConnectedToNetwork() ? Constants.resourceResolver.build(from: source) : PRdplayerDownloadResourceLoader(source: source)

        prepareAsset(from: videoURL.absoluteString)
        requestIDFA()
    }

    public func prepareAsset(from urlString: String) {
        playerState.source = source
        guard let mediaURL = URL(string: urlString) else {
            assertionFailure("Failed to obtain media url")
            return
        }
        let asset = AVURLAsset(url: mediaURL)
        if let delegate = resourceDelegate {
            asset.resourceLoader.setDelegate(delegate,queue: queue)
            asset.resourceLoader.preloadsEligibleContentKeys = true
        }

        asset.loadValuesAsynchronously(forKeys: [AssetKeys.playable.rawValue]) { [weak self] in
            guard let self = self else { return }
            var error: NSError? = nil
            let status = asset.statusOfValue(forKey: AssetKeys.playable.rawValue,error: &error)
            switch status {
            case .loading:
                EventManager.shared.dispatchEvent(eventName: EventKeys.loadStartEvent.rawValue,payload: nil)
            case .loaded:
                let playerItem = AVPlayerItem(asset: asset)

                ...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。