iOS8

2014-10-24 21 views
8

'daki bir video PHAsset'in diskindeki dosya boyutunu nasıl belirleyebilirim iOS8'deki Fotoğraflar çerçevesini kullanarak bir video PHAsset'i isteyebilirim. Dosyanın diskte ne kadar büyük olduğunu bilmek istiyorum. Bunu belirlemek için PHAsset'in bir özelliği görülmemektedir. Herkesin bir çözümü var mı?iOS8

cevap

22

Düzenleme videonun ilk çerçevesi bir görüntü sonuçlanacak bir video türü PHAsset üzerinde requestImageDataForAsset kullanarak iOS 9.3 gelince

, (Kullanarak Fotoğraflar çerçeve gerekmemektedir), bu yüzden değil mi artık çalışmak Bunun yerine aşağıdaki yöntemi kullanın, normal video için istek seçeneği nil olabilir, ancak ağır çekim videosu için PHVideoRequestOptionsVersionOriginal'un ayarlanması gerekir.

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 

    } 
}]; 

// orijinal cevap PHAsset için

, bunu kullanın: ALAsset için

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

:

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

Bir video varlığı üzerinde test, PHAsset gösterir Boyut 43.703125, ALAsset ise boyutu 43.703005 olarak göstermektedir.

Düzenle PHAsset için, dosya boyutunun başka bir yolu. Ama @Alfie Hanssen'in bahsettiği gibi, normal video üzerinde çalışıyor, ağır çekim videosu için, aşağıdaki yöntem blokta bir AVCompozition varlığını döndürecek, dolayısıyla bu tür için çek ekledim. Ağır çekim videosu için requestImageDataForAsset yöntemini kullanın.

[[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

Teşekkür ederiz! Hiçbir istek yokturVideoDataForAsset ... ve bu requestImageDataForAsset videonun boyutunu döndürür – jlw

+0

Evet, özellikle video için requestAVAssetForVideo kullanabilirsiniz. – gabbler

+0

Bu yöntem bir AVCompozition (AVURLAsset olarak yayınlanamaz) döndürüyor gibi görünüyor. Yukarıda gösterildiği gibi yapmaya çalışmak bir çarpışma ile sonuçlanır. iOS 8.1.2. –

0

Bilmen istediğiniz videonun boyutu AVURLAsset türü değil ise, oldukça yüksek bir şans çektim. Ama kaputun altında, videonuzun (örneğin, ham örnekler, yavaş-mo zaman aralıkları, filtreler, vb.) Bir araya getirildiği daha fazla dosya var, çünkü bir beton oynanabilir dosyanın boyutunu bilmek istersiniz. Bu durumda, dosya boyutunun gerçekte nasıl karşılandığından emin değilim, ancak bu nasıl yapılmalıdır:

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

almak mümkün değildir. Sadece bir not, dokümanlar şunu ifade eder: 'assetExportSession.estimatedOutputFileLength' AVAssetExportPresetPassThrough' için her zaman 0'a dönün. Dikkat edin ... –

+0

notu, 'tahminiOutputFileLength' olduğu gibi, gerçek dosya boyutu olduğunu düşünemezsiniz. Benim durumumda 30 MB'lik bir fark vardı. –