我希望获得AVAsset
视频文件大小,而不是视频的分辨率,但文件重量以KB为单位。
解决方案是从持续时间和estimatedDataRate计算估计的文件大小,但这似乎只是为了获得文件大小。
我已检查AVAssetTrack
中嵌入的所有数据,但似乎并未存在。即使是估计的文件大小也不错。
答案 0 :(得分:11)
这是一个简单的 Swift 4.x / 3.x 扩展程序,可以为您提供I'M
的大小:
AVURLAsset
这会返回一个可选的import AVFoundation
extension AVURLAsset {
var fileSize: Int? {
let keys: Set<URLResourceKey> = [.totalFileSizeKey, .fileSizeKey]
let resourceValues = try? url.resourceValues(forKeys: keys)
return resourceValues?.fileSize ?? resourceValues?.totalFileSize
}
}
,因为Int
和resourceValues.fileSize
都会返回可选的Ints。
虽然当然可以修改它以返回0而不是nil,但我选择不这样做,因为那不准确。你不确定它的大小是0,你只能得到这个值。
要打电话:
resouceValues.totalFileSize
如果尺寸返回nil,则将打印0,如果您选择,则返回不同的值。
答案 1 :(得分:9)
使用您的方法我得到了正确的答案。我发布这个给任何人看,我期待在IPOD库中更简单的替代AVAssets
AVURLAsset* asset;
asset = [[AVURLAsset alloc]initWithURL:realAssetUrl options:nil];
NSArray *tracks = [asset tracks];
float estimatedSize = 0.0 ;
for (AVAssetTrack * track in tracks) {
float rate = ([track estimatedDataRate] / 8); // convert bits per second to bytes per second
float seconds = CMTimeGetSeconds([track timeRange].duration);
estimatedSize += seconds * rate;
}
float sizeInMB = estimatedSize / 1024 / 1024;
float sizeinGB = sizeInMB / 1024;
这给了我2.538 GB,这是我在ITunes中看到的。
答案 2 :(得分:3)
我通过从文件URL请求大小来解决这个问题。下面的示例将提供字节数。只需将数字除以1024即可获得KB数。
如果您需要获取单个文件的文件大小,可以通过构建文件URL并直接查询URL属性来实现。
NSURL *fileURL = [NSURL fileURLWithPath:filePath];
NSNumber *fileSizeValue = nil;
[fileURL getResourceValue:&fileSizeValue
forKey:NSURLFileSizeKey
error:nil];
if (fileSizeValue) {
NSLog(@"value for %@ is %@", fileURL, fileSizeValue);
}
答案 3 :(得分:1)
这是@agressen在Swift 2中的答案
extension AVAsset {
var g_fileSize: Double {
guard let avURLAsset = self as? AVURLAsset else { return 0 }
var result: AnyObject?
try? avURLAsset.URL.getResourceValue(&result, forKey: NSURLFileSizeKey)
if let result = result as? NSNumber {
return result.doubleValue
} else {
return 0
}
}
}
答案 4 :(得分:0)
我发现的另一种方法是使用FileManager。
NSFileManager *fileManager = [NSFileManager defaultManager];
NSDictionary *attrs = [fileManager attributesOfItemAtPath:filePath error: NULL];
_fileSize = [attrs fileSize];
答案 5 :(得分:0)
这个答案可能会对一些支持Swift 3的人有所帮助:
if(videoAsset!.isKind(of: AVURLAsset.self)){
if let avassetURL = videoAsset as? AVURLAsset {
var urlAsset : URL = avassetURL.url
var keys = Set<URLResourceKey>()
keys.insert(URLResourceKey.totalFileSizeKey)
keys.insert(URLResourceKey.fileSizeKey)
do{
let URLResourceValues = try urlAsset.resourceValues(forKeys: keys)
if let fileSize = URLResourceValues.fileSize{}
if let totalFileSize = URLResourceValues.totalFileSize{}
}catch _{}
}
}