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

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

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

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


person TheSquad    schedule 28.11.2013    source источник
comment
Не могли бы вы опубликовать метод, который вы использовали с оценкамиDataRate * Duration , так как я не могу найти ничего лучше   -  person Ryan Heitner    schedule 03.12.2014


Ответы (6)


Вот простое расширение 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 вместо nil, я предпочитаю не делать этого, так как это будет неточно. Вы не знаете наверняка, что это размер 0, вы просто не можете получить значение.

Чтобы назвать это:

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

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

person CodeBender    schedule 23.04.2017
comment
вы можете удалить три строки вашего кода do, catch, return nil, добавив оператор ? после try - person zombie; 25.09.2017
comment
@zombie Спасибо, я прошел и обрезал его еще немного, чтобы сделать его еще меньше. - person CodeBender; 25.09.2017
comment
Как я могу добиться этого для AVAsset, а не для AVURLAsset? - person Roi Mulia; 29.11.2017
comment
@RoiMulia Вы не можете, описание Apple для AVAsset ( developer.apple.com/documentation/avfoundation/ avasset ) объясняет это во втором абзаце о том, как вам нужно создать подкласс с AVURLAsset, чтобы иметь доступ к URL-адресу, поскольку AVAsset не имеет этой информации. - person CodeBender; 29.11.2017
comment
Спасибо! Думаю, я буду искать обходной путь, чем :) - person Roi Mulia; 30.11.2017
comment
Обратите внимание, что этот подход действителен только для URL-адресов, указывающих на локальную файловую систему. URL-адреса HTTP будут возвращать nil для обоих полей. - person GSnyder; 12.06.2018

Используя ваш метод, я получаю правильный ответ. Я публикую это для тех, кто ищет, я с нетерпением жду более простой альтернативы 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.

person Ryan Heitner    schedule 03.12.2014
comment
Это выполняется до, во время или после загрузки? - person Julius; 31.07.2017
comment
Является ли estimatedSize продолжительностью всего видео? - person Supertecnoboff; 07.02.2018

Я решил это, запросив размер из URL-адреса файла. Пример ниже предоставит количество байтов. Просто разделите число на 1024, чтобы получить количество КБ.

Если вам нужно получить размер файла одного файла, вы можете сделать это, создав для него 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);
}
person agressen    schedule 24.07.2014
comment
Не будет работать для HLS (.movpkg), это даст вам что-то около 200 байт. - person mgyky; 09.11.2020

Вот ответ @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
    }
  }
}
person onmyway133    schedule 06.09.2016
comment
Разве не следует вместо этого возвращать result.unsignedLongLongValue? И вы не забыли позаботиться об этой дополнительной попытке? - person SirEnder; 26.09.2016

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

NSFileManager *fileManager = [NSFileManager defaultManager];
NSDictionary *attrs = [fileManager attributesOfItemAtPath:filePath error: NULL];
_fileSize = [attrs fileSize];
person Dave Cumming    schedule 02.03.2016
comment
Это фактически дает размер 204 байта, соответствующий любому активу HLS. Не нужно говорить, что это не может быть правдой. - person Julius; 02.08.2017

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