我尝试在播放HLS流的同时缓存它。我遵循了Apple的文档(播放离线资源一节):
我已经实现了下面的方法-这应该会让我的HLS流在播放时下载:
func downloadAndPlayAsset(_ asset: AVURLAsset) {
// Create new AVAssetDownloadTask for the desired asset
// Passing a nil options value indicates the highest available bitrate should be downloaded
let downloadTask = downloadSession.makeAssetDownloadTask(asset: asset,
assetTitle: assetTitle,
assetArtworkData: nil,
options: nil)!
// Start task
downloadTask.resume()
// Create standard playback items and begin playback
let playerItem = AVPlayerItem(asset: downloadTask.urlAsset)
player = AVPlayer(playerItem: playerItem)
player.play()
}问题是它不会下载视频,只会播放视频。我也实现了委托,但它们都不会被调用:
func urlSession(_ session: URLSession, assetDownloadTask: AVAssetDownloadTask, didLoad timeRange: CMTimeRange, totalTimeRangesLoaded loadedTimeRanges: [NSValue], timeRangeExpectedToLoad: CMTimeRange)
func urlSession(_ session: URLSession, assetDownloadTask: AVAssetDownloadTask, didFinishDownloadingTo location: URL)
func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?)相当奇怪的是,我注意到下一次打开应用程序时,assetDownloadURLSession.getAllTasks会返回上一次会话中我下载的待定任务。因此,它不会下载流,但会将它们添加到挂起队列中。你知道这背后的理由是什么吗?我有一个理论,正在下载的流和实况流使用不同的质量,所以它确实需要以正确的质量重新下载。所以我创建了一个HLS流用于测试,只有一种质量,但结果仍然是一样的。
如果我删除了将AVPlayerItem分配给AVPlayer的代码行,下载就开始了,所有的委托都会被调用。因此,下载它自己的工作,但任何时候我试图播放它只是停止。
感谢您的帮助!
托马斯
发布于 2021-02-01 07:45:24
我有一个理论,正在下载的流和直播流使用不同的质量,所以它确实需要以正确的质量重新下载。
你的理论是正确的。
所以下载它自己的工作,但任何时候我试图播放它只是停止。
下载将被推迟,直到AVPlayerItem终止。尝试调用player.replaceCurrentItem(nil)。
发布于 2019-10-04 16:08:31
这是在iOS13或更新版本上发生的吗?如果是这样的话,我们可能会遇到同样的问题,而苹果只是没有给我们任何成功
https://stackoverflow.com/questions/58206226
复制相似问题