AVPlayer播放超时设置及默认超时时长技术咨询
AVPlayer 播放超时相关问题解答
1. AVPlayer的默认播放超时时长是多少?
AVPlayer 本身并没有对外公开默认的播放超时时长。它的网络加载超时逻辑依赖于底层的系统网络栈以及媒体资源的加载机制,苹果并未在官方文档中明确给出这个默认值。实际场景中,这个超时时间会受系统网络配置、资源服务器响应情况等因素影响。
2. 如何为AVPlayer的播放设置超时?
以下是两种可行的实现方式:
方式一:通过URLSession自定义加载并设置超时
借助URLSession配置请求超时,再通过AVAssetResourceLoader将加载的媒体数据传递给AVPlayer,示例代码如下:
// 配置URLSession超时参数 let sessionConfig = URLSessionConfiguration.default sessionConfig.timeoutIntervalForRequest = 10 // 单次请求超时10秒 sessionConfig.timeoutIntervalForResource = 30 // 资源加载总超时30秒 let session = URLSession(configuration: sessionConfig) // 自定义资源加载代理 class CustomResourceLoaderDelegate: NSObject, AVAssetResourceLoaderDelegate { func resourceLoader(_ resourceLoader: AVAssetResourceLoader, shouldWaitForLoadingOfRequestedResource loadingRequest: AVAssetResourceLoadingRequest) -> Bool { guard let url = loadingRequest.request.url else { return false } let task = session.dataTask(with: url) { data, response, error in if let error = error { loadingRequest.finishLoading(with: error) return } guard let response = response, let data = data else { let error = NSError(domain: "CustomLoader", code: -1, userInfo: [NSLocalizedDescriptionKey: "资源加载失败"]) loadingRequest.finishLoading(with: error) return } // 设置资源信息 loadingRequest.contentInformationRequest?.contentType = (response as? HTTPURLResponse)?.mimeType loadingRequest.contentInformationRequest?.contentLength = response.expectedContentLength // 返回加载的数据 loadingRequest.dataRequest?.respond(with: data) loadingRequest.finishLoading() } task.resume() return true } } // 初始化带自定义加载的AVPlayer let mediaURL = URL(string: "你的媒体资源地址")! let asset = AVURLAsset(url: mediaURL) let loaderDelegate = CustomResourceLoaderDelegate() asset.resourceLoader.setDelegate(loaderDelegate, queue: DispatchQueue.global()) let playerItem = AVPlayerItem(asset: asset) let player = AVPlayer(playerItem: playerItem)
方式二:监听AVPlayerItem状态配合定时器实现超时
通过监听AVPlayerItem的status属性,结合定时器判断加载是否超时,示例代码如下:
let playerItem = AVPlayerItem(url: URL(string: "你的媒体资源地址")!) let player = AVPlayer(playerItem: playerItem) var timeoutTimer: Timer? // 监听播放项状态 playerItem.addObserver(self, forKeyPath: "status", options: [.new], context: nil) // 启动超时定时器(15秒后判断) timeoutTimer = Timer.scheduledTimer(withTimeInterval: 15, repeats: false) { [weak self] _ in guard let self = self else { return } if playerItem.status == .unknown { // 超时处理逻辑 self.player.pause() print("播放加载超时") } } // KVO回调处理 override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { if keyPath == "status" { timeoutTimer?.invalidate() timeoutTimer = nil switch playerItem.status { case .readyToPlay: print("资源已准备好,可以播放") case .failed: print("加载失败:\(playerItem.error?.localizedDescription ?? "未知错误")") case .unknown: break @unknown default: break } } }
注意:使用定时器时,要在页面销毁、播放完成等合适时机销毁定时器,避免内存泄漏。
内容的提问来源于stack exchange,提问作者israel_b_2012
相关产品推荐
相关产品推荐

