我尝试了iOS13.0和iOS13.1,但仍然不起作用,我尝试了AVAggregateAssetDownloadTask和AVAssetDownloadURLSession,但它们都不起作用。没有任何代理被调用来告诉我finish的错误,我发现下载的缓存只有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)}发布于 2019-10-22 20:40:06
发现AVAssetDownloadURLSession只能将包含codec属性的主播放列表结构的HLS下载到iOS 13+上的EXT-X-STREAM-INF m3u8 meta中。
我不知道这是bug还是函数限制。(没有CODECS属性的m3u8 meta可以用AVFoundation播放,但不能用AVAssetDownloadURLSession下载)
无论如何,解决方案是:
如果您有HLS主播放列表:
将CODECS属性添加到m3u8 meta中的#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的m3u8,因此是CODECS属性。
发布于 2020-04-20 16:58:19
所以,我发现'AVAssetDownloadTask‘在调用iOS 13 (13.1,13.2.13.3)中的委托时出现了一些错误。最后,在iOS 13.4.1中,苹果修复了这个错误,现在代理在设置委托并启动任务后调用。下面是我用来从服务器下载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上尝试了一下,它和预期的一样工作。而且,它已经出现在苹果开发者论坛here上了。希望这对某些人有帮助。
https://stackoverflow.com/questions/58182120
复制相似问题