尝试了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)}
发现AVAssetDownloadURLSession
只能将包含codec
属性的主播放列表结构的HLS下载到iOS 3 +上的EXT-X-STREAM-INF
m3u8 meta中。
我不知道这是错误还是功能限制。 (M3U8 meta没有CODECS
属性可以用AVFoundation
玩,但不能用AVAssetDownloadURLSession
下载(
无论如何,解决方案是:
如果您有 HLS 主播放列表:
将CODECS
属性添加到 M3U8 元中的#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。
因此,我发现"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开发人员论坛上。希望这对某人有所帮助。