使用AvassetDownloadurlsession正确下载下载的进度



我正在下载离线视频,感谢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
}

当然,我们可以以不同的方式写这本书,例如。

随时询问有关此事的任何事情。

相关内容

  • 没有找到相关文章

最新更新