2011-05-12 39 views
8

iPhone4, iOS 4.3.3, iOS SDK4.3MPMoviePlayerController - Duración siempre 0

Hola a todos,

estoy creando una función de carga de vídeo. Los videos se recuperan usando UIImagePickerController y se pueden capturar usando la cámara o recogidos de la biblioteca de fotos. Tengo una restricción de aplicación de 60 segundos de duración máxima. Esto se logra fácilmente al grabar el vídeo utilizando la cámara a través de:

// vídeos límite de 60 segundos

[setVideoMaximumDuration selector: 60];

Sin embargo cuando el vídeo se selecciona de la biblioteca de fotos la única forma que veo de la obtención de la duración es a través de la propiedad MPMoviePlayerController duración de la siguiente manera:

// MediaType puede ser kUTTypeImage o kUTTypeMovie.

NSString * mediaType = [info objectForKey: UIImagePickerControllerMediaType]; NSLog (@ "% @", mediaType);

// si es una película

if ([mediaType isEqualToString:(NSString*)kUTTypeMovie]) { 

    // get the URL 
    NSURL* mediaURL = [info objectForKey:UIImagePickerControllerMediaURL]; 
    NSLog(@"%@",mediaURL); 

    // can use MPMoviePlayerController class to get duration 
    int duration = -1; 
    MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL: mediaURL]; 
    if (moviePlayer != nil) { 

     duration = moviePlayer.duration; 
     NSString *path = moviePlayer.contentURL; 

     [moviePlayer release]; 
    } 

sin embargo, la duración es siempre 0. Sé que el vídeo tiene una duración debido a que la duración se muestra como parte de los subtítulos cuando seleccionándolo en la biblioteca de fotos. Entiendo que la duración puede no estar siempre disponible, pero en este caso, la duración se muestra en photo lib. También verifico la propiedad contentURL y tiene un buen valor. Puedo recuperar el archivo, obtener su tamaño de archivo, etc., así sé que el NSURL del archivo es bueno ...

¡Gracias!

+1

Puede escuchar la MPMovieDurationAvailableNotification. Eso requeriría que mantengas el MoviePlayer todo el tiempo suficiente para que pueda determinar la duración. La biblioteca de fotos probablemente usa un valor en caché. – omz

+0

@imobilizer Si la respuesta a continuación ayudó, marque como es aceptado. – memmons

Respuesta

16

No veo nada inmediatamente incorrecto con su código. Sin embargo, usar AVFoundation es mucho más rápido para este tipo de operación. Aquí hay un fragmento de código para obtener la duración usando AVFoundation:

AVURLAsset *asset = [[[AVURLAsset alloc] initWithURL:anURI 
         options:[NSDictionary dictionaryWithObjectsAndKeys: 
         [NSNumber numberWithBool:YES], 
         AVURLAssetPreferPreciseDurationAndTimingKey, 
         nil]] autorelease]; 

NSTimeInterval durationInSeconds = 0.0; 
if (asset) 
    durationInSeconds = CMTimeGetSeconds(asset.duration) ; 
+0

Gracias Harkonian, en realidad este código no funcionó de manera inmediata. – imobilizer

+0

Gracias @Harkonian, en realidad este código no funcionó de la misma manera ya que hay un puntero no válido para la advertencia de conversión de enteros y cuando lo ejecuté una línea para recuperar la duración recibida SIGABRT después de lanzar NSException. Después de crear ASSET, necesito recuperar la duración de la siguiente manera: CMTime assetTime = [duración del activo]; Float64 duration = CMTimeGetSeconds (assetTime); – imobilizer

+0

Fix: NSTimeInterval duration = 0.0; if (activo) duration = CMTimeGetSeconds (asset.duration); – konradowy

Cuestiones relacionadas