bestimmen Ich kann ein Video PHAsset mit dem Fotos-Framework in iOS8 anfordern. Ich würde gerne wissen, wie groß die Datei auf der Festplatte ist. Es scheint keine Eigenschaft von PHAsset zu sein, dies zu bestimmen. Hat jemand eine Lösung? (Verwenden von Fotos Rahmen nicht erforderlich)Wie kann ich die Dateigröße auf der Festplatte eines Video PHAsset in iOS8
Antwort
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
}
}];
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
})
abzurufen Nur eine Anmerkung, die Dokumente sagen, dass 'assetExportSession.estimatedOutputFileLength' geben Sie immer 0 für 'AVAssetExportPresetPassThrough' zurück. Achten Sie darauf, ... –
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. –
Vielen Dank! Es ist seltsam, dass es kein requestVideoDataForAsset gibt ... und dass requestImageDataForAsset die Größe des Videos zurückgibt – jlw
Ja, Sie können requestAVAssetForVideo verwenden, was speziell für Video ist. – gabbler
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. –