我想获得AVAsset
视频文件的大小,而不是视频的分辨率,而是以 KB 为单位的文件重量。
一种解决方案是根据持续时间和估计的DataRate 计算估计的文件大小,但这似乎只是为了获得文件大小。
我检查了嵌入其中的所有数据AVAssetTrack
似乎不在那里。即使是估计的文件大小也会很好。
这是一个简单的Swift 4.x / 3.x扩展,可让您获得任意大小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
}
}
这将返回一个 optional Int
,因为两者都resourceValues.fileSize
返回resouceValues.totalFileSize
可选的 Ints。
虽然当然可以修改它以返回 0 而不是 nil,但我选择不这样做,因为这不准确。您不确定它的大小为 0,您只是无法获得该值。
调用它:
let asset = AVURLAsset(url: urlToYourAsset)
print(asset.fileSize ?? 0)
如果大小返回 nil,那么它将打印 0,或者如果您愿意,则打印一个不同的值。
使用你的方法,我得到了正确的答案。我为任何寻找的人发布此内容,我期待在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 中看到的。
我通过从文件 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);
}
这是@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
}
}
}
可能这个答案会帮助一些支持 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 _{}
}
}
我发现的另一种产生相同结果的方法是使用 FileManager。
NSFileManager *fileManager = [NSFileManager defaultManager];
NSDictionary *attrs = [fileManager attributesOfItemAtPath:filePath error: NULL];
_fileSize = [attrs fileSize];