我正在尝试安全地播放在线直播流(.m3u8)。我正在创建一个AVAsset,并将它的委托分配给一个符合AVAssetResourceLoader的单例。问题是,delegate方法没有被调用。
代码:
PlayerViewController:
let asset: AVURLAsset = AVURLAsset(url: url, options: ["AVURLAssetHTTPHeaderFieldsKey": headerFields])
let item = AVPlayerItem(asset: asset)
player = AVPlayer(playerItem: item)
asset.resourceLoader.setDelegate(SSLAuthenticator.default, queue: DispatchQueue.main)SSL授权码
func resourceLoader(_ resourceLoader: AVAssetResourceLoader, shouldWaitForResponseTo authenticationChallenge: URLAuthenticationChallenge) -> Bool {
print("0")
return true
}
func resourceLoader(_ resourceLoader: AVAssetResourceLoader, didCancel authenticationChallenge: URLAuthenticationChallenge) {
print("1")
}
func resourceLoader(_ resourceLoader: AVAssetResourceLoader, didCancel loadingRequest: AVAssetResourceLoadingRequest) {
print("2")
}
func resourceLoader(_ resourceLoader: AVAssetResourceLoader, shouldWaitForLoadingOfRequestedResource loadingRequest: AVAssetResourceLoadingRequest) -> Bool {
print("3")
return true
}
func resourceLoader(_ resourceLoader: AVAssetResourceLoader, shouldWaitForRenewalOfRequestedResource renewalRequest: AVAssetResourceRenewalRequest) -> Bool {
print("4")
return true
}有人知道为什么委托方法没有被调用吗?谢谢
发布于 2019-08-30 18:00:50
当AVPlayer不知道如何下载数据时,就会调用AVAssetResourceLoaderDelegate的方法。因此,对于像https://link_to_data.com这样的网址,AVPlayer会自动下载数据。若要强制AVPlayer使用您的委托,该URL应包含未知方案,例如custom://link_to_data.com。Here is an excellent example of implementing that.
发布于 2021-06-15 13:26:48
在这种情况下,委托实例需要保存在内存中,在您的情况下,您可以尝试将SSLAuthenticator.default存储在某个全局变量中,然后将其设置为委托。
gloabalObject = SSLAuthenticator.default
asset.resourceLoader.setDelegate(gloabalObject, queue: DispatchQueue.main)通常,如果委托实例在其方法被调用之前被销毁,则不会调用委托方法。
https://stackoverflow.com/questions/57408355
复制相似问题