【问题标题】:How can I determine file size on disk of a video PHAsset in iOS8如何确定 iOS8 中视频 PHAsset 磁盘上的文件大小
【发布时间】:2014-12-20 09:51:32
【问题描述】:

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

【问题讨论】:

    标签: ios video photokit photosframework


    【解决方案1】:

    编辑

    对于 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
        }
    }];
    

    【讨论】:

    • 谢谢!奇怪的是没有requestVideoDataForAsset...而且requestImageDataForAsset返回的是视频的大小
    • 是的,你可以使用 requestAVAssetForVideo,它是专门用于视频的。
    • 此方法似乎返回一个 AVComposition(无法转换为 AVURLAsset)。如上所示尝试这样做会导致崩溃。 iOS 8.1.2。
    • 是的,我刚刚仔细检查了一遍,它们绝对是视频。但看起来任何 slomo 视频都作为 AVComposition 返回(普通视频确实是 AVURLAssets)。检查完成块的信息字典参数会显示其他元数据:PHAdjustmentDataKey = "<PHAdjustmentData: 0x174244110> identifier=com.apple.video.slomo version=1.1 data=0x174243d50 (200)";。因此,进行类检查以确认强制转换是安全的似乎是个好主意。
    • 在 iOS 9.3 及更高版本中使用 PHAsset 的第一种方法似乎不起作用
    【解决方案2】:

    您很有可能,您想知道的视频的大小不是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 的差异。
    【解决方案3】:

    带有文件大小格式的 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)
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-26
      • 2020-10-17
      • 2011-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-04
      • 2023-04-04
      相关资源
      最近更新 更多