2014-10-24 12 views

risposta

22

Modifica

Per quanto riguarda iOS 9.3, utilizzando requestImageDataForAsset su un tipo di video PHAsset si tradurrà in un'immagine, che è il primo fotogramma del video, in modo che non lavoro più. Utilizzare il seguente metodo invece, per il video normale, l'opzione di richiesta può essere nil, ma per i video al rallentatore, è necessario impostare 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 

    } 
}]; 

// risposta originale

Per PHAsset, utilizzare questo:

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

Per ALAsset:

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

ho testato su una risorsa video, mostra la PHAsset dimensioni come 43.703125, ALAsset mostra la dimensione come 43.703005.

Modifica Per PHAsset, un altro modo per ottenere la dimensione del file. Ma come ha detto @Alfie Hanssen, funziona su video normali, per i video al rallentatore, il metodo seguente restituirà un asset AVComposition nel blocco, quindi ho aggiunto il controllo per il suo tipo. Per i video al rallentatore, utilizzare il metodo 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

Grazie! È strano che non ci sia richiestaVideoDataForAsset ... e che requestImageDataForAsset restituisca la dimensione del video – jlw

+0

Sì, puoi usare requestAVAssetForVideo, che è specifico per il video. – gabbler

+0

Questo metodo sembra restituire una composizione AV (impossibile eseguire il cast come AVURLAsset). Il tentativo di farlo come mostrato sopra provoca un crash. iOS 8.1.2. –

0

È tirare piuttosto elevata probabilità, che il video che vuoi sapere è di dimensioni non è il tipo di AVURLAsset. Ma va bene che sotto il cofano ci sono più file di cui il tuo video è composto (per esempio campioni grezzi, intervalli di tempo slow-mo, filtri, ecc ...), perché vuoi conoscere la dimensione di un concreto file riproducibile. Non sono sicuro di come le dimensioni dei file stimati soddisfino la realtà in questo caso, ma questo è come dovrebbe essere fatto:

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

Solo una nota, i documenti dicono che 'assetExportSession.estimatedOutputFileLength' sarà restituire sempre 0 per 'AVAssetExportPresetPassThrough'. Attenzione ... –

+0

nota, poiché si tratta di 'EstimateOutputFileLength', non si può considerare che sia il file effettivo. Nel mio caso c'era una differenza di 30 MB. –

Problemi correlati