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