如何确定iOS8中videoPHAsset的磁盘上的文件大小

我可以使用iOS8中的Photos框架来请求一个videoPHAsset。 我想知道文件在磁盘上有多大。 似乎没有PHAsset的属性来确定这一点。 有没有人有办法解决吗? (不需要使用照片框架)

编辑

对于iOS 9.3,在videotypesPHAsset上使用requestImageDataForAsset会生成一个图像,这是video的第一帧,因此不再有效。 请使用以下方法,对于普通video,请求选项可以nil ,但对于慢动作video,需要设置PHVideoRequestOptionsVersionOriginal

 PHVideoRequestOptions *options = [[PHVideoRequestOptions alloc] init]; options.version = PHVideoRequestOptionsVersionOriginal; [[PHImageManager defaultManager] requestAVAssetForVideo:asset options:options resultHandler:^(AVAsset *asset, AVAudioMix *audioMix, NSDictionary *info) { if ([asset isKindOfClass:[AVURLAsset class]]) { AVURLAsset* urlAsset = (AVURLAsset*)asset; NSNumber *size; [urlAsset.URL getResourceValue:&size forKey:NSURLFileSizeKey error:nil]; NSLog(@"size is %f",[size floatValue]/(1024.0*1024.0)); //size is 43.703005 } }]; 

//原来的答案

对于PHAsset,使用这个:

 [[PHImageManager defaultManager] requestImageDataForAsset:asset options:nil resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) { float imageSize = imageData.length; //convert to Megabytes imageSize = imageSize/(1024*1024); NSLog(@"%f",imageSize); }]; 

对于ALAsset:

 ALAssetRepresentation *rep = [asset defaultRepresentation]; float imageSize = rep.size/(1024.0*1024.0); 

我testing了一个video资产,PHAsset显示大小为43.703125,ALAsset显示大小为43.703005。

编辑对于PHAsset,另一种获取文件大小的方法。 但正如@Alfie Hanssen所说的,它适用于普通video,对于慢动作video,下面的方法会返回一个AVComposition资产块,所以我添加了它的types检查。 对于慢动作video,请使用requestImageDataForAsset方法。

 [[PHImageManager defaultManager] requestAVAssetForVideo:asset options:nil resultHandler:^(AVAsset *asset, AVAudioMix *audioMix, NSDictionary *info) { if ([asset isKindOfClass:[AVURLAsset class]]) { AVURLAsset* urlAsset = (AVURLAsset*)asset; NSNumber *size; [urlAsset.URL getResourceValue:&size forKey:NSURLFileSizeKey error:nil]; NSLog(@"size is %f",[size floatValue]/(1024.0*1024.0)); //size is 43.703005 NSData *data = [NSData dataWithContentsOfURL:urlAsset.URL]; NSLog(@"length %f",[data length]/(1024.0*1024.0)); // data size is 43.703005 } }]; 

你有很高的机会,你想知道的video的大小不是AVURLAssettypes。 但是,引擎盖下还有更多的video合成文件(例如原始样本,慢速时间范围,filter等等),因为您想知道具体的可播放文件的大小。 在这种情况下,我不确定文件大小是如何满足实际的,但是这是应该如何完成的:

 PHImageManager.defaultManager().requestExportSessionForVideo(asset, options: nil, exportPreset: AVAssetExportPresetHighestQuality, resultHandler: { (assetExportSession, info) -> Void in // Here you set values that specifies your video (original, after edit, slow-mo, ...) and that affects resulting size. assetExportSession.timeRange = CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(asset.duration, 30)) // Time interval is default from zero to infinite so it needs to be set prior to file size computations. Time scale is I believe (it is "only" preferred value) not important in this case. let HERE_YOU_ARE = assetExportSession.estimatedOutputFileLength })