如何获取Video AVAsset的大小(KB)

时间:2013-11-28 13:20:12

标签: ios avasset

我希望获得AVAsset视频文件大小,而不是视频的分辨率,但文件重量以KB为单位。

解决方案是从持续时间和estimatedDataRate计算估计的文件大小,但这似乎只是为了获得文件大小。

我已检查AVAssetTrack中嵌入的所有数据,但似乎并未存在。即使是估计的文件大小也不错。

6 个答案:

答案 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 } } ,因为IntresourceValues.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 _{}
    }
}