我正在跟踪苹果关于缓存HLS (.m3u8)视频的文档。
在文档中的Playing脱机AVAssetDownloadTask中,指示它使用AVAssetDownloadTask的资产同时开始播放。
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()
}问题是同一资产被下载了两次。
在初始化AVPlayer之后,它就开始缓冲资产。最初,我假设必须使用缓冲区中的数据来创建缓存,但是AVAssetDownloadTask在AVPlayer播放完该资产之前不会开始下载用于缓存的数据。缓冲数据基本上被丢弃。
我在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中播放。
发布于 2021-01-31 23:39:48
您的AVAssetDownloadTask必须配置为下载AVPlayerItem请求的不同的HLS变体。
如果AVAssetDownloadTask已经下载了一些数据,那么您的AVPlayerItem将随后使用它。但是,如果AVPlayerItem已经下载了一些数据,您的AVAssetDownloadTask可能会忽略它,因为它需要满足下载配置的要求。
https://stackoverflow.com/questions/63467772
复制相似问题