Cómo get el tamaño (KB) de un video AVAsset

Me gustaría get un tamaño de file de video AVAsset , no la resolución del video, pero el peso del file en KB.

Una solución sería calcular un tamaño de file estimado a partir de la duración y el estimatedDataRate, pero esto parece ser mucho para get un tamaño de file.

He comprobado todos los datos embeddeds en AVAssetTrack que no parece estar allí. Incluso un tamaño de file estimado sería bueno.

Usando su método obtengo la respuesta correcta. Publico esto para cualquier persona que mira, espero una alternativa más simple para AVAssets en la Biblioteca 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; 

Esto me da 2.538 GB, que es lo que veo en iTunes.

Aquí hay una extensión Swift 4.x / 3.x simple para get el tamaño de cualquier 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 } } 

Esto devuelve un Int opcional, ya que tanto resourceValues.fileSize como resouceValues.totalFileSize devuelven Ints opcionales.

Si bien es ciertamente posible modificarlo para devolver un 0 en lugar de cero, elijo no hacerlo, ya que no sería preciso. No sabe con certeza que es el tamaño 0, simplemente no puede get el valor.

Para llamarlo:

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

Si el tamaño devuelve nil, de lo que se imprime 0, o un valor diferente si así lo desea.

Resolví esto solicitando el tamaño de la url del file. La siguiente muestra proporcionará el número de bytes. Simplemente divida el número por 1024 para get el número de KB.

Si necesita get el tamaño de file de un solo file, puede hacerlo construyendo una URL de file y consultar directamente los attributes de la URL.

 NSURL *fileURL = [NSURL fileURLWithPath:filePath]; NSNumber *fileSizeValue = nil; [fileURL getResourceValue:&fileSizeValue forKey:NSURLFileSizeKey error:nil]; if (fileSizeValue) { NSLog(@"value for %@ is %@", fileURL, fileSizeValue); } 

Otra forma que he encontrado que da el mismo resultado es usar FileManager.

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

Aquí está la respuesta de @agressen en 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 _{ } } }