2014-10-24 6 views

Antwort

22

bearbeiten

Wie für iOS 9.3, mit requestImageDataForAsset auf einem Videotyp PHAsset in einem Bild führen, welches das erste Frame des Videos ist, so tut es nicht arbeite mehr. Verwenden Sie stattdessen die folgende Methode, für normales Video kann die Anforderungsoption nil lauten, aber für Zeitlupenvideo muss PHVideoRequestOptionsVersionOriginal festgelegt werden.

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 

    } 
}]; 

// ursprüngliche Antwort

Für PHAsset, verwenden Sie diese:

[[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); 
}]; 

Für ALAsset:

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

ich auf ein Video-Asset getestet, PHAsset zeigt die Größe wie 43.703125, zeigt ALAsset die Größe als 43.703005.

Bearbeiten Für PHAsset, eine andere Möglichkeit, Dateigröße zu erhalten. Aber wie schon von Alfie Hanssen erwähnt, funktioniert es bei normalem Video, bei Slow-Motion-Video wird die folgende Methode ein AVComposition-Asset im Block zurückgeben, also habe ich den Check für seinen Typ hinzugefügt. Verwenden Sie für Zeitlupenvideos die Methode 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 
    } 
}]; 
+1

Vielen Dank! Es ist seltsam, dass es kein requestVideoDataForAsset gibt ... und dass requestImageDataForAsset die Größe des Videos zurückgibt – jlw

+0

Ja, Sie können requestAVAssetForVideo verwenden, was speziell für Video ist. – gabbler

+0

Diese Methode scheint eine AVComposition zurückzugeben (kann nicht als AVURLAsset umgewandelt werden). Der oben beschriebene Versuch führt zu einem Absturz. iOS 8.1.2. –

0

Sie wuchten recht hohe Wahrscheinlichkeit, dass Video, das Sie wissen wollen, ist die Größe nicht Art von AVURLAsset ist. Aber es ist in Ordnung, dass unter der Haube mehr Dateien sind, aus denen dein Video zusammengesetzt ist (zum Beispiel rohe Samples, Slow-Mo-Zeitbereiche, Filter, etc ...), weil du die Größe einer konkreten abspielbaren Datei wissen willst. Ich bin mir nicht sicher, wie die geschätzte Dateigröße in diesem Fall die Realität erfüllt, aber so soll es gemacht werden:

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 
}) 
+0

abzurufen Nur eine Anmerkung, die Dokumente sagen, dass 'assetExportSession.estimatedOutputFileLength' geben Sie immer 0 für 'AVAssetExportPresetPassThrough' zurück. Achten Sie darauf, ... –

+0

beachten Sie, da es die 'geschätzteOutputFileLength' ist, können Sie nicht betrachten, dass es die tatsächliche Dateigröße ist. In meinem Fall gab es einen Unterschied von 30 MB. –