如何确定iOS8中视频PHAsset的磁盘上的文件大小

jlw*_*jlw 9 video ios photosframework photokit

我可以使用iOS8中的Photos框架请求视频PHAsset.我想知道文件在磁盘上有多大.似乎没有PHAsset的属性来确定它.有没有人有办法解决吗?(不需要使用Photos框架)

gab*_*ler 24

编辑

对于iOS 9.3,requestImageDataForAsset在视频类型上使用PHAsset将产生图像,这是视频的第一帧,因此它不再起作用.使用以下方法代替,对于普通视频,请求选项可以是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

    }
}];
Run Code Online (Sandbox Code Playgroud)

//原始答案

对于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);
 }];
Run Code Online (Sandbox Code Playgroud)

对于ALAsset:

ALAssetRepresentation *rep = [asset defaultRepresentation];
float imageSize = rep.size/(1024.0*1024.0);
Run Code Online (Sandbox Code Playgroud)

我测试了一个视频资产,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
    }
}];
Run Code Online (Sandbox Code Playgroud)