gpt4 book ai didi

ios - 使用 AVAssetDownloadTask 进行 HLS 缓存

转载 作者:行者123 更新时间:2023-12-05 07:02:42 27 4
gpt4 key购买 nike

我正在关注 Apple 关于缓存 HLS (.m3u8) 视频的文档。

https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/MediaPlaybackGuide/Contents/Resources/en.lproj/HTTPLiveStreaming/HTTPLiveStreaming.html

文档中Playing Offline Assets下提示使用AVAssetDownloadTask的asset同时开始播放。

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()
}

问题是同一 Assets 被下载了两次

AVPlayer 初始化后立即开始缓冲 Assets 。最初,我假设缓冲区中的数据必须用于创建缓存,但是 AVAssetDownloadTask 在 AVPlayer 完成播放 Assets 之前不会开始下载数据进行缓存。缓冲数据基本被丢弃。

我在 currentItem.loadedTimeRanges 上使用了 KVO 来检查缓冲区的状态。

playerTimeRangesObserver = currentPlayer.observe(\.currentItem?.loadedTimeRanges, options: [.new, .old]) { (player, change) in

let time = self.currentPlayer.currentItem?.loadedTimeRanges.firs.
if let t = time {
print(t.timeRangeValue.duration.seconds)
}
}

以下方法查看AVAssetDownloadTask的下载状态。

/// Method to adopt to subscribe to progress updates of an AVAssetDownloadTask.
func urlSession(_ session: URLSession, assetDownloadTask: AVAssetDownloadTask, didLoad timeRange: CMTimeRange, totalTimeRangesLoaded loadedTimeRanges: [NSValue], timeRangeExpectedToLoad: CMTimeRange) {

// This delegate callback should be used to provide download progress for your AVAssetDownloadTask.
guard let asset = activeDownloadsMap[assetDownloadTask] else { return }

var percentComplete = 0.0
for value in loadedTimeRanges {
let loadedTimeRange: CMTimeRange = value.timeRangeValue
percentComplete +=
loadedTimeRange.duration.seconds / timeRangeExpectedToLoad.duration.seconds
}

print("PercentComplete for \(asset.stream.name) = \(percentComplete)")
}

这是正确的行为还是我做错了什么?我希望能够使用正在缓存的视频数据(正在下载 AVAssetDownloadTask)在 AVPlayer 中播放。

最佳答案

您的 AVAssetDownloadTask 必须配置为下载不同于您的 AVPlayerItem 请求的 HLS 变体。

如果您已经通过 AVAssetDownloadTask 下载了一些数据,您的 AVPlayerItem 随后将使用它。但是如果你已经有一些数据被 AVPlayerItem 下载,你的 AVAssetDownloadTask 可能会忽略它,因为它需要满足你的下载配置的要求。

关于ios - 使用 AVAssetDownloadTask 进行 HLS 缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63467772/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com