在iOS 10中,Apple添加了离线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获取文件大小的SO上的其他答案似乎不适用于这些,也没有为获取加载的AVAsset的大小做出答案。提前谢谢。
答案 0 :(得分:0)
请改为尝试:
let att = try FileManager.default.attributesOfItem(atPath: assetURL.path)
答案 1 :(得分:0)
唯一的方法是对存储下载内容的文件夹中的所有文件大小求和。
- (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;
}
答案 2 :(得分:0)
以下是计算离线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
}
if let url = URL(string: localFileLocation),
let size = self.getHLSFileSize(at: url.path) {
result = String(size)
}