14

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

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

我检查了嵌入其中的所有数据AVAssetTrack似乎不在那里。即使是估计的文件大小也会很好。

4

6 回答 6

16

这是一个简单的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,或者如果您愿意,则打印一个不同的值。

于 2017-04-23T20:14:19.750 回答
10

使用你的方法,我得到了正确的答案。我为任何寻找的人发布此内容,我期待在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 中看到的。

于 2014-12-03T08:56:45.067 回答
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);
}
于 2014-07-24T12:28:27.263 回答
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
    }
  }
}
于 2016-09-06T13:57:08.193 回答
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 _{}
    }
}
于 2017-02-22T13:34:29.097 回答
0

我发现的另一种产生相同结果的方法是使用 FileManager。

NSFileManager *fileManager = [NSFileManager defaultManager];
NSDictionary *attrs = [fileManager attributesOfItemAtPath:filePath error: NULL];
_fileSize = [attrs fileSize];
于 2016-03-02T02:24:04.110 回答