我正在下载离线视频,感谢AvassetDownloadurlsession,AvassetDownloadloaddelegate iOS 11使用MakeAssetDownloadtask(...)和AggregateAseassetDownloadtask(...)方法。
一切都有效,但我只想让用户尽可能准确地知道每个下载的进度。
我使用:
- urlSession(_ session: URLSession, assetDownloadTask: AVAssetDownloadTask, didLoad timeRange: CMTimeRange, totalTimeRangesLoaded loadedTimeRanges: [NSValue], timeRangeExpectedToLoad: CMTimeRange)
- urlSession(_ session: URLSession, aggregateAssetDownloadTask: AVAggregateAssetDownloadTask, didLoad timeRange: CMTimeRange, totalTimeRangesLoaded loadedTimeRanges: [NSValue], timeRangeExpectedToLoad: CMTimeRange, for mediaSelection: AVMediaSelection)
使用这些方法,我可以分别计算视频的下载进度和每个轨道(音频/字幕)。因此,我认为该视频是下载的70%,对于轨道,它的30%除以曲目数量。我将每个项目的下载进度存储在临时词典中(乘以其比率),并且我添加了每个进度以具有全局表示形式。
最终效果很好,但不如预期的那么光滑。例如,我花了3分钟来下载内容,但是如果轨道的重量很轻,则进度将从1秒中的70%跃升至85%(如果我有2个曲目要下载),然后立即放慢速度。我想取得全球进步。
我绝对对此解决方案不满意,但我目前没有找到其他解决方案。
你们中有些想法/解决方案吗?
谢谢大家
解决方案
首先,这只是我的情况,您应该为您的需求更新方法。
在我的情况下,作为最复杂的数组示例我有类似的东西:
[English(soun),Turkish(soun),English(sbtl),Turkish(sbtl)]
我们将给出 AUDIO所有音频的80%,为20%的所有字幕。
总计算公式必须是这样的:
(100*(0,80/2))+(100*(0,80/2))+(100*(0,20/2))+(100(0,20/2))
我们需要一个枚举来表示avmediatype:
// AVMediaType
enum MediaType: String {
// Sound
case soun
// Subtitle
case sbtl
// Closed Caption
// case clcp // Removed for simplifying the example.
}
另外,我们需要一个字典来处理资产下载进度:
var totalDownloadProgressForAsset = [String: Double]()
这是方法:
public func getTotalProgress() -> Double {
var result = 0.0
let soundMultiplier = 0.80
let subtitleMultiplier = 0.20
var soundCount = 0
var subtitleCount = 0
for (key, _) in totalDownloadProgressForAsset {
let mediaTypeKey = String(key.suffix(4))
let type = MediaType(rawValue: mediaTypeKey)
switch type {
case .soun:
soundCount += 1
case .sbtl:
subtitleCount += 1
case .none:
break
}
}
for (key, value) in totalDownloadProgressForAsset {
let mediaTypeKey = String(key.suffix(4))
let type = MediaType(rawValue: mediaTypeKey)
switch type {
case .soun:
result += Double(value*(soundMultiplier/Double(soundCount)))
case .sbtl:
result += Double(value*(subtitleMultiplier/Double(subtitleCount)))
case .none:
break
}
}
return result
}
当然,我们可以以不同的方式写这本书,例如。
随时询问有关此事的任何事情。