AVAssetDownloadTask iOS13

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)}

我甚至没有收到任何错误信息,当调用task.resume()时,它就变得很安静了。 请问你的错误信息来自哪里? - saiday
@saiday在发布版本上没有遇到任何错误,我认为这只是在13 beta1上发生的。我正在尝试修复我的m3u8文件,请在此处查看https://forums.developer.apple.com/thread/121097 - Chan Gu
谢谢,如果您找到解决方案,请告诉我们。 - saiday
这是一个苹果公司的错误,已经被修复了。 - mAc
2个回答

2

发现AVAssetDownloadURLSession只能下载包含codec属性的主播放列表结构HLS,并且该属性位于iOS 13+上的EXT-X-STREAM-INF m3u8元数据中。

我不知道这是一个错误还是功能限制。(m3u8元数据没有CODECS属性可以使用AVFoundation播放,但无法使用AVAssetDownloadURLSession进行下载)

无论如何,解决方案是:

如果您有HLS主播放列表:

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

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

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

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


嗨,@saiday,谢谢你的回复。我尝试将我的HLS文件更改为主播放列表,它起作用了,但是,还有一个问题,我的缓存只能播放一次,如果我再次尝试播放它,就什么也没有加载,也没有错误,只是一个黑色视图。我尝试重新启动我的应用程序,但它仍然发生。你有同样的问题吗? - Chan Gu
如果您能提供HLS URL,我可以查看一下。我对已下载的资产播放没有任何问题。 - saiday
嗨,@saiday,https://storage.googleapis.com/rfp-banner-dev/guchan/output/smartnews-multi/playlist.m3u8 这是我的网址,谢谢您的好意。 - Chan Gu

1

所以,我发现在iOS 13(13.1、13.2、13.3)中调用代理时,“AVAssetDownloadTask”存在一些错误。最终,在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上尝试了这个方法,效果符合预期。此外,这个方法已经在苹果开发者论坛这里发布。希望能对某些人有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接