在使用AVAssetDownloadTask播放时缓存HLS视频



我在播放HLS流时尝试缓存它。我正在关注Apple文档(播放离线资产部分(:

https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/MediaPlaybackGuide/Contents/Resources/en.lproj/HTTPLiveStreaming/HTTPLiveStreaming.html#//apple_ref/doc/uid/TP40016757-CH11-SW1

我已经实现了以下方法 - 这应该使我的 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 的行,下载将开始并调用所有委托。因此,下载自己的作品,但每当我尝试播放它时,它都会停止。

感谢您的帮助!

托马斯

我有一个理论,即正在下载的流和实时流使用不同的质量,因此确实需要以正确的质量重新下载。

你的理论是正确的。

因此,下载自己的作品,但每当我尝试播放它时,它都会停止。

下载将延迟到 AVPlayerItem 终止。尝试调用player.replaceCurrentItem(nil)

这发生在 iOS13 或更高版本上吗? https://forums.developer.apple.com/thread/121097 如果是这样,我们可能遇到了同样的问题,而苹果只是没有给我们任何打击。

相关内容

  • 没有找到相关文章

最新更新