【问题标题】:AVAssetDownloadTask iOS13AVAssetDownloadTask iOS13
【发布时间】:2019-10-01 09:44:36
【问题描述】:

尝试了 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 在发布版本上没有收到任何错误,我认为它只是在 13 beta1 上发生。我正在尝试修复我的 m3u8 文件,请查看此处forums.developer.apple.com/thread/121097
  • 谢谢,如果您找到了解决方案,请告诉我们。
  • 这是苹果的一个错误,已经修复。

标签: ios swift ios13 avasset avassetdownloadtask


【解决方案1】:

发现AVAssetDownloadURLSession 只能将包含codec 属性的主播放列表结构的HLS 下载到iOS 13+ 上的EXT-X-STREAM-INF m3u8 元中。

我不知道这是错误还是功能限制。 (m3u8 meta没有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。

【讨论】:

  • 嗨,@saiday,谢谢你的回复。我尝试将我的 HLS 文件更改为母版播放列表,但它有效,但是,是的,另一个但是,我的缓存只能播放 1 次,如果我再次尝试播放,没有加载任何内容,也没有错误,只是一个黑色视图没有。我尝试重新启动我的应用程序,但它仍然发生。你有同样的问题吗?
  • 如果你能提供你的 HLS URL 我可以看看。我对下载的资产播放没有任何问题。
  • 嗨@saiday,storage.googleapis.com/rfp-banner-dev/guchan/output/…这是我的网址,谢谢你的好意
【解决方案2】:

所以,我发现“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 开发者论坛 here 上。希望这对某人有所帮助。

【讨论】:

    猜你喜欢
    • 2018-01-08
    • 1970-01-01
    • 2021-08-28
    • 2020-04-26
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多