我正在使用AVAssetResourceLoadingDelegate
拦截 HLS 清单的所有清单请求
let str = "examplehttp://example.com/path/to/master.m3u8?token=SOMETOKEN"
guard let url = URL(string: str) else { return }
let asset = AVURLAsset(url: url)
let loaderQueue = DispatchQueue(label: "com.example.LoaderQueue")
asset.resourceLoader.setDelegate(delegate, queue: loaderQueue)
let item = AVPlayerItem(asset: asset)
player = AVPlayer(playerItem: item)
player?.playImmediately(atRate: 1.0)
在委托中,我自己使用所有清单请求URLSession
并将响应返回给AVAssetResourceLoadingRequest
// NOTE: dataRequest: AVAssetResourceLoadingDataRequest
dataRequest.respond(with: data)
loadingRequest.response = response
loadingRequest.finishLoading()
此流使用相当标准的身份验证过程进行保护:
对主清单的请求是使用附加的令牌查询参数发出的。对主清单的响应包括一个 set-cookie 标头。在 set-cookie 响应标头上指定域的每个后续请求都在其请求标头中包含 cookie。
我发现通过委托发出的所有请求都将 cookie 添加到标头中,但由于委托不能用于 TS 段,因此没有添加 cookie。
有谁知道一种方法来强制AVURLAsset
始终使用对主清单的响应提供的 cookie 标头来处理在外部发出的请求AVAssetResourceLoaderDelegate
?
由于我确实提供了URLResponse
支持,AVAssetResourceLoadingRequest
并且我知道您可以使用 URLSessionConfiguration 的 、 和 属性将 cookie 添加httpShouldAccpetCookies
到httpCookieAcceptPolicy
URLSession httpCookieStorage
。我不认为这超出了可能性范围。
我也知道AVURLAssetHTTPCookiesKey
可以将其添加到实例化中,AVURLAasset
但在发出主清单请求之前我没有 cookie。