首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用AVAssetDownloadTask的HLS缓存

使用AVAssetDownloadTask的HLS缓存
EN

Stack Overflow用户
提问于 2020-08-18 11:34:41
回答 1查看 456关注 0票数 3

我正在跟踪苹果关于缓存HLS (.m3u8)视频的文档。

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

在文档中的Playing脱机AVAssetDownloadTask中,指示它使用AVAssetDownloadTask的资产同时开始播放。

代码语言:javascript
复制
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来检查缓冲区的状态。

代码语言:javascript
复制
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下载状态的方法。

代码语言:javascript
复制
/// 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中播放。

EN

回答 1

Stack Overflow用户

发布于 2021-01-31 23:39:48

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63467772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档