2012-01-02 6 views
20

Estoy usando UIImagePickerController para elegir el archivo de video de la biblioteca. Y el usuario puede subir el video.iPhone: ¿Cómo obtener la duración del video seleccionado de la biblioteca?

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

Quiero saber cómo puedo obtener la duración del archivo de video seleccionado? para que pueda restringir al usuario la carga de videos que tienen una duración de más de 20 segundos.

soy capaz de obtener algo de información básica sobre el vídeo seleccionado por 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 acerca de la duración del vídeo seleccionado.

Gracias ...

Respuesta

31

consiguió la solución: Yo uso AVPlayerItem clase y AVFoundation y CoreMedia marco.

#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); 
} 
+1

También es necesario vincular el marco de CoreMedia CMTimeGetSeconds para que funcione correctamente. –

+0

¿podemos recortar un video para una duración determinada? – iEinstein

+0

@AshutoshMishra: http://stackoverflow.com/a/7239164/616094 – Maulik

1

Sí, puede utilizar la propiedad "duración" definida por MPMediaPlayerController. Pruébelo y compruebe la salida. U puede referir aquí duration property

Trate de usar el MPMediaPlayerController para reproducir el video y luego use la propiedad "duración". U podrá obtener claramente los detalles sobre la duración del video.

2

En el caso de que use AVFoundation y AssetLibrary frameworks, puede enumerar todos los activos, aplicar filtro solo para videos y obtener 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 consola.

videoclip número 0 es 66.80833333333334 segundos

videoclip número 1 es 190.06 segundos

videoclip número 2 es 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]; 
} 
28

La otra respuesta a esta pregunta utilizando AVPlayerItem didn' t trabajo para mí, pero esto 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); 
} 
+0

¡Lo mismo aquí! Este funcionó como un encanto. Thx – Bobjt

+0

¡Esto a partir de iOS8 es la respuesta correcta! – elliotrock

+0

Esta es la respuesta correcta. – Ibdakine

5

Swift

independientemente del uso o didFinishPickingMediaWithInfodidFinishRecordingToOutputFileAtURL 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 
+1

Gracias por su respuesta. –

2

Swift 3.0 y Swift 4

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

gracias..ayuda @khalsa g –

Cuestiones relacionadas