【发布时间】:2014-12-20 09:51:32
【问题描述】:
我可以使用 iOS8 中的照片框架请求视频 PHAsset。我想知道磁盘上的文件有多大。似乎没有 PHAsset 的属性来确定这一点。有没有人有办法解决吗? (不需要使用 Photos 框架)
【问题讨论】:
标签: ios video photokit photosframework
我可以使用 iOS8 中的照片框架请求视频 PHAsset。我想知道磁盘上的文件有多大。似乎没有 PHAsset 的属性来确定这一点。有没有人有办法解决吗? (不需要使用 Photos 框架)
【问题讨论】:
标签: ios video photokit photosframework
编辑
对于 iOS 9.3,在视频类型 PHAsset 上使用 requestImageDataForAsset 将生成图像,这是视频的第一帧,因此不再起作用。改用下面的方法,普通视频请求选项可以是nil,但慢动作视频需要设置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);
我测试了一个视频资产,PHAsset 显示大小为 43.703125,ALAsset 显示大小为 43.703005。
编辑
对于 PHAsset,另一种获取文件大小的方法。但是正如@Alfie Hanssen 提到的,它适用于普通视频,对于慢动作视频,以下方法将在块中返回一个 AVComposition 资产,因此我添加了对其类型的检查。对于慢动作视频,使用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
}
}];
【讨论】:
PHAdjustmentDataKey = "<PHAdjustmentData: 0x174244110> identifier=com.apple.video.slomo version=1.1 data=0x174243d50 (200)";。因此,进行类检查以确认强制转换是安全的似乎是个好主意。
您很有可能,您想知道的视频的大小不是AVURLAsset 的类型。但是,在引擎盖下有更多的文件是您的视频合成的(例如原始样本、慢动作时间范围、过滤器等),这是可以的,因为您想知道具体可播放文件的大小。我不确定在这种情况下估计的文件大小如何符合实际情况,但应该这样做:
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
})
【讨论】:
assetExportSession.estimatedOutputFileLength 将始终为AVAssetExportPresetPassThrough 返回0。当心...
estimatedOutputFileLength,所以你不能认为它是实际的文件大小。就我而言,有 30 MB 的差异。
带有文件大小格式的 Swift 版本:
let options = PHVideoRequestOptions()
options.version = .original
PHImageManager.default().requestAVAsset(forVideo: asset, options: options) { avAsset, _, _ in
if let urlAsset = avAsset as? AVURLAsset { // Could be AVComposition class
if let resourceValues = try? urlAsset.url.resourceValues(forKeys: [.fileSizeKey]),
let fileSize = resourceValues.fileSize {
let formatter = ByteCountFormatter()
formatter.countStyle = .file
let string = formatter.string(fromByteCount: Int64(fileSize))
print(string)
}
}
}
【讨论】: