Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS脱机HLS文件大小_Ios_Swift_Avfoundation_Http Live Streaming_Avasset - Fatal编程技术网

iOS脱机HLS文件大小

iOS脱机HLS文件大小,ios,swift,avfoundation,http-live-streaming,avasset,Ios,Swift,Avfoundation,Http Live Streaming,Avasset,在iOS 10中,苹果增加了离线HLS。在文件中,他们提到: 重要提示:下载的HLS资产存储在私有磁盘中 捆绑格式。此捆绑包格式可能会随着时间的推移而改变,开发人员 不应尝试访问或存储捆绑包中的文件 直接,但应改为使用AVFoundation和其他iOS API 与下载的资产交互 对这些文件信息的访问似乎受到限制。我正在尝试查找存储文件的大小。这就是我要做的。下载完成后,我保存相对路径 func urlSession(_ session: URLSession, assetDownloadTas

在iOS 10中,苹果增加了离线HLS。在文件中,他们提到:

重要提示:下载的HLS资产存储在私有磁盘中 捆绑格式。此捆绑包格式可能会随着时间的推移而改变,开发人员 不应尝试访问或存储捆绑包中的文件 直接,但应改为使用AVFoundation和其他iOS API 与下载的资产交互

对这些文件信息的访问似乎受到限制。我正在尝试查找存储文件的大小。这就是我要做的。下载完成后,我保存相对路径

func urlSession(_ session: URLSession, assetDownloadTask: AVAssetDownloadTask, didFinishDownloadingTo location: URL) {
        //Save path
        video?.downloadPath = location.relativePath

    }
稍后,我按照如下方式重构文件路径

if let assetPath = workout.downloadPath {
                let baseURL = URL(fileURLWithPath: NSHomeDirectory())
                let assetURL = baseURL.appendingPathComponent(assetPath)
这项工作:

try FileManager.default.removeItem(at: assetURL)
这不存在,并返回文件不存在的错误:

let att = try FileManager.default.attributesOfItem(atPath: assetURL.absoluteString)
我可以按如下方式加载视频资源并使用脱机播放:

let avAsset = AVURLAsset(url: assetURL)
但这会返回一个空数组:

let tracks = avAsset.tracks(withMediaType: AVMediaTypeVideo)
我再次尝试获取脱机HLS资产的文件大小。其他答案似乎都打开了,因此使用FileManager获取文件大小的答案不适用于这些答案,获取加载的AVAsset大小的答案也不适用。提前感谢。

试试这个:

let att = try FileManager.default.attributesOfItem(atPath: assetURL.path)

唯一的方法是将存储下载内容的文件夹中的所有文件大小相加

- (NSUInteger)hlsFileSize:(NSURL *)fileURL {

    NSUInteger size = 0;

    let enumerator = [NSFileManager.defaultManager enumeratorAtURL:fileURL includingPropertiesForKeys:nil options:0 errorHandler:nil];
    for (NSURL *url in enumerator) {
        NSError *error = nil;

        // Get values
        let resourceValues = [url resourceValuesForKeys:@[NSURLIsRegularFileKey, NSURLFileAllocatedSizeKey, NSURLNameKey] error:&error];

        // Skip unregular files
        let isRegularFile = [resourceValues[NSURLIsRegularFileKey] boolValue];
        if (!isRegularFile) {
            continue;
        }

        let fileAllocatedSize = [resourceValues[NSURLFileAllocatedSizeKey] unsignedLongLongValue];

        size += fileAllocatedSize;
    }

    return size;
}
Swift 5.3解决方案 以下是如何计算脱机HLS(.movpkg)文件大小:

/// Calculates HLS File Size.
/// - Parameter directoryPath: file directory path.
/// - Returns: Human Redable File Size.
func getHLSFileSize(at directoryPath: String) -> String? {
    var result: String? = nil
    let properties: [URLResourceKey] = [.isRegularFileKey,
                                        .totalFileAllocatedSizeKey,
                                        /*.fileAllocatedSizeKey*/]

    guard let enumerator = FileManager.default.enumerator(at: URL(fileURLWithPath: directoryPath),
                                         includingPropertiesForKeys: properties,
                                         options: .skipsHiddenFiles,
                                         errorHandler: nil) else {

                                            return nil
    }

    let urls: [URL] = enumerator
        .compactMap { $0 as? URL }
        .filter { $0.absoluteString.contains(".frag") }

    let regularFileResources: [URLResourceValues] = urls
        .compactMap { try? $0.resourceValues(forKeys: Set(properties)) }
        .filter { $0.isRegularFile == true }

    let sizes: [Int64] = regularFileResources
        .compactMap { $0.totalFileAllocatedSize! /* ?? $0.fileAllocatedSize */ }
        .compactMap { Int64($0) }

    
    let size = sizes.reduce(0, +)
    result = ByteCountFormatter.string(fromByteCount: Int64(size), countStyle: .file)
    
    return result
}
用法
嘿,我现在真的得到了属性,但是,文件大小似乎完全错了。我下载了两个文件,它们都返回204作为“let fileSize=attr[FileAttributeKey.size]as!UInt64”。首先,它们都不应该那么小,而且大小也非常不同。这里的问题相同。我以前也有同样的问题,这就是为什么我(通常)会这样做的原因使用此要点中的函数获得适当的文件大小估计值:将
allocatedSizeOfDirectory(at:)
与资产一起使用时,它应该可以工作。我得到了143575400字节,这正是手机对这项资产(1.44Gb)的存储量估算的干净整洁
if let url = URL(string: localFileLocation),
    let size = self.getHLSFileSize(at: url.path) {
    result = String(size)
}