iPhone: ¿Cómo get la duración del video seleccionado de la biblioteca?

Estoy usando UIImagePickerController para elegir el file de video de la biblioteca. Y el usuario puede upload el video.

También estoy usando la propiedad videoMaximumDuration mientras el usuario quiere capturar video y uploadlo.

Quiero saber que ¿Cómo puedo get la duración del file de video seleccionado? para que pueda restringir el usuario para upload videos que tengan una duración de más de 20 segundos.

Puedo get información básica sobre el video seleccionado con este código:

 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { selectedVideoUrl = [info objectForKey:UIImagePickerControllerMediaURL]; NSError *error; NSDictionary * properties = [[NSFileManager defaultManager] attributesOfItemAtPath:selectedVideoUrl.path error:&error]; NSNumber * size = [properties objectForKey: NSFileSize]; NSLog(@"Vide info :- %@",properties); } 

Pero no hay nada sobre la duración del video seleccionado.

Gracias…

Tengo la solución: uso la class AVFoundation y CoreMedia y CoreMedia framework.

 #import <AVFoundation/AVFoundation.h> #import <AVFoundation/AVAsset.h> - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { selectedVideoUrl = [info objectForKey:UIImagePickerControllerMediaURL]; AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:selectedVideoUrl]; CMTime duration = playerItem.duration; float seconds = CMTimeGetSeconds(duration); NSLog(@"duration: %.2f", seconds); } 

La otra respuesta a esta pregunta usando AVPlayerItem no funcionó para mí, pero sí lo hizo usando AVURLAsset:

 #import <AVFoundation/AVFoundation.h> -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { NSURL *videoURL=[info objectForKey:@"UIImagePickerControllerMediaURL"]; AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoURL options:nil]; NSTimeInterval durationInSeconds = 0.0; if (asset) durationInSeconds = CMTimeGetSeconds(asset.duration); } 

Rápido

independientemente de usar didFinishPickingMediaWithInfo o didFinishRecordingToOutputFileAtURL , puede:

 // needed only for didFinishPickingMediaWithInfo let outputFileURL = info[UIImagePickerControllerMediaURL] as! NSURL // get the asset let asset = AVURLAsset(URL: outputFileURL) // get the time in seconds let durationInSeconds = asset.duration.seconds 

En el caso de que use los AVFoundation y AssetLibrary, puede enumerar todos los activos, aplicar filter solo para videos y get la duración de cada video con el método - (id)valueForProperty:(NSString *)property . Pase en ALAssetPropertyDuration para la propiedad. El siguiente código imprime lo siguiente en la console.

El videoclip número 0 es 66.80833333333334 segundos.

video clip número 1 es 190.06 segundos

video clip número 2 es de 13.74 segundos

 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. if (!assetItems) { assetItems = [[NSMutableArray alloc] init]; } else { [assetItems removeAllObjects]; } if (!assetLibrary) { assetLibrary = [[ALAssetsLibrary alloc] init]; } ALAssetsLibraryGroupsEnumerationResultsBlock listBlock = ^(ALAssetsGroup *group, BOOL *stop) { if (group) { [group setAssetsFilter:[ALAssetsFilter allVideos]]; [group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) { if (result) { [assetItems addObject:result]; NSString *duration = [result valueForProperty:ALAssetPropertyDuration]; NSLog(@"video clip number %d is %@ seconds\n",index, duration); } }]; } }; ALAssetsLibraryAccessFailureBlock failBlock = ^(NSError *error) { // error handler block NSString *errorTitle = [error localizedDescription]; NSString *errorMessage = [error localizedRecoverySuggestion]; NSLog(@"%@...\n %@\n",errorTitle,errorMessage); }; [assetLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:listBlock failureBlock:failBlock]; } 

Sí, puede usar la propiedad "duración" definida por MPMediaPlayerController. Plese pruébelo y verifique la salida. U puede referir la propiedad duración aquí

Intenta usar MPMediaPlayerController para reproducir el video y luego usa la propiedad "duración". U podrá get claramente los detalles sobre la duración del video.

Swift 3.0

 let outputFileURL = info[UIImagePickerControllerMediaURL] as! NSURL // get the asset let asset = AVURLAsset.init(url: outputFileURL as URL) // get the time in seconds let durationInSeconds = asset.duration.seconds print("==== Duration is ",durationInSeconds)