3

尝试了 iOS13.0 和 iOS13.1 仍然无法正常工作,我尝试了 AVAggregateAssetDownloadTask 和 AVAssetDownloadURLSession 但它们都没有工作。没有调用任何代表告诉我完成错误,我发现下载的缓存只有 25Kb,大小不合适。

错误是:

Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed" UserInfo={NSLocalizedDescription=The operation could not be completed, _NSURLErrorFailingURLSessionTaskErrorKey=BackgroundAVAssetDownloadTask <AFDCA3CC-FA49-488B-AB16-C74425345EE4>.<1>, _NSURLErrorRelatedURLSessionTaskErrorKey=(

    "BackgroundAVAssetDownloadTask <AFDCA3CC-FA49-488B-AB16-C74425345EE4>.<1>"

), NSLocalizedFailureReason=An unknown error occurred (-16654)}
4

2 回答 2

2

发现AVAssetDownloadURLSession只能将具有主播放列表结构的 HLS 下载codecEXT-X-STREAM-INFiOS 13+ 上的 m3u8 元中。

我不知道这是错误还是功能限制。(m3u8元没有CODECS属性可以玩AVFoundation,但不能下载AVAssetDownloadURLSession

无论如何,解决方案是:

如果您有 HLS 主播放列表:

在 m3u8 元中添加CODECS属性。#EXT-X-STREAM-INF例如

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:BANDWIDTH=63701,CODECS="mp4a.40.34"
playlist.m3u8

如果您还没有 HLS 主播放列表:

即使您不支持自适应流媒体,您也必须制作一个主播放列表。
主播放列表是唯一可以包含#EXT-X-STREAM-INF因此CODECS属性的 m3u8。

于 2019-10-22T12:40:05.590 回答
1

因此,我发现“AVAssetDownloadTask”在 iOS 13 (13.1,13.2.13.3) 中调用委托时出现了一些错误。最后,在 iOS 13.4.1 中,Apple 修复了这个错误,现在委托在设置委托和启动任务后调用。下面是我用来开始从服务器下载 m3u8 文件并将其保存为资产以供以后离线播放的内容。

func downloadVideo(_ url: URL) {
    let configuration = URLSessionConfiguration.background(withIdentifier: currentFileName)

    let downloadSession = AVAssetDownloadURLSession(configuration: configuration,
                                                    assetDownloadDelegate: self,
                              delegateQueue: OperationQueue.main)
    // HLS Asset URL
    let asset = AVURLAsset(url: url)

    // Create new AVAssetDownloadTask for the desired asset
    let downloadTask = downloadSession.makeAssetDownloadTask(asset: asset,
                                                             assetTitle: currentFileName,
                                                             assetArtworkData: nil,
                                                             options: nil)
    // Start task and begin download
    downloadTask?.resume()
}

我在 iOS 12 和 iOS 13.4.1 上试过这个,它按预期工作。此外,它已经出现在 Apple 开发者论坛。希望这可以帮助某人。

于 2020-04-20T08:58:18.513 回答