【问题标题】:Cache HLS video while playing with AVAssetDownloadTask使用 AVAssetDownloadTask 播放时缓存 HLS 视频
【发布时间】:2019-10-02 17:13:00
【问题描述】:

我正在尝试在播放 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 的行,则下载开始并调用所有代表。所以下载自己的作品,但任何时候我尝试播放它都会停止。

感谢您的帮助!

托马斯

【问题讨论】:

    标签: ios swift avplayer http-live-streaming avassetdownloadtask


    【解决方案1】:

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

    你的理论是正确的。

    所以下载自己的作品,但任何时候我尝试播放它都会停止。

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

    【讨论】:

    • 如果The download will be deferred until the AVPlayerItem is terminated,如何实现边下载边播放?
    • 只需将 AVPlayerItem 连接到与 AVAssetDownloadTask 一起使用的同一 AVAsset。无论 AVAssetDownloadTask 下载了什么, AVPlayerItem 都可以使用。无论 AVPlayerItem 下载什么,AVAssetDownloadTask 都可以使用。
    • 这是我目前正在做的事情,但我意识到当 AVPlayItem 像你说的那样使用 AVAsset(播放它)时下载不会开始。我想知道如何实现同时缓存和播放。
    【解决方案2】:

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

    【讨论】:

    • 感谢您的回复。我仍在 iOS 12 上进行测试。很高兴知道 iOS 13 上可能存在问题……我们实际上可能会放弃整个 HLS 方法(在我看来,API 是迄今为止我在 Apple 生态系统中看到的最糟糕的 API 之一)并直接下载 mp4(在我们的用例中有意义)。
    • @TomášKohout 怎么样 1. 尝试另一个 m3u8 或 2. 在不同的线程上启动会话,到目前为止我相信它在 iOS12 上工作
    • 嘿,我不确定我们是否在谈论同一件事 - 下载在 iOS 12 上有效,但在我同时播放视频时不能。顺便说一句,我已经安装了 iOS 13,它似乎对我来说下载得很好(但仍然不能同时播放,这是主要问题)。当下载随机停止工作时,我发现了一个烦人的错误,我必须重新启动设备才能再次工作。
    • @TomášKohout 尝试不要添加相同的资产,只需通过您的视频网址重新初始化 AVPlayerItem,如下所示:your.playerItem = [[AVPlayerItem alloc] initWithURL:yourVideoUrl];
    猜你喜欢
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 2013-06-04
    • 2016-11-08
    相关资源
    最近更新 更多