如何确定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的大小不是AVURLAsset
types。 但是,引擎盖下还有更多的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 })