Как получить размер (KB) видео AVAsset

Я хотел бы получить размер видеофайла AVAsset, а не разрешение видео, но вес файла в КБ.

Решением будет вычисление оцененного размера файла из продолжительности и оценочногоDataRate, но это, похоже, очень просто, чтобы получить размер файла.

Я проверил все данные, встроенные в AVAssetTrack, похоже, что он там отсутствует. Даже оцененный размер файла будет приятным.

Ответ 1

Используя ваш метод, я получаю правильный ответ. Я отправляю это для всех, кто ищет, я с нетерпением жду более простой альтернативы для AVAssets в библиотеке IPOD.

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 ГБ, что я вижу в ITunes.

Ответ 2

Ниже приведено простое расширение 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
    }
}

Это возвращает необязательный Int, поскольку оба resourceValues.fileSize и resouceValues.totalFileSize возвращают необязательные Инты.

Хотя можно, конечно, изменить его, чтобы вернуть 0 вместо нуля, я не хочу этого делать, поскольку это было бы неточно. Вы точно не знаете, что это размер 0, вы просто не можете получить значение.

Чтобы вызвать его:

let asset = AVURLAsset(url: urlToYourAsset)
print(asset.fileSize ?? 0)

Если размер возвращает ноль, то он будет печатать 0 или другое значение, если вы это сделаете.

Ответ 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);
}

Ответ 4

Другим способом, который я нашел, который дает тот же результат, является использование FileManager.

NSFileManager *fileManager = [NSFileManager defaultManager];
NSDictionary *attrs = [fileManager attributesOfItemAtPath:filePath error: NULL];
_fileSize = [attrs fileSize];

Ответ 5

Вот ответ @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
    }
  }
}

Ответ 6

Может быть, этот ответ поможет некоторым, кто поддерживает 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 _{}
    }
}