2011-05-12 4 views
8

iPhone4, iOS 4.3.3, iOS SDK4.3MPMoviePlayerController - Durée toujours 0

Salut à tous,

Je crée une fonction de téléchargement vidéo. Les vidéos sont récupérées à l'aide de UIImagePickerController et peuvent être capturées à l'aide de la caméra ou sélectionnées dans la photothèque. J'ai une contrainte d'application de 60 secondes maximum. Ceci est facilement réalisé lors de l'enregistrement de la vidéo en utilisant la caméra via:

// Vidéos limite à 60 secondes

[sélecteur setVideoMaximumDuration: 60];

Toutefois, lorsque la vidéo est sélectionnée à partir de la photothèque de la seule façon que je vois d'obtenir la durée est par la propriété de la durée MPMoviePlayerController comme suit:

// MediaType peut être kUTTypeImage ou kUTTypeMovie.

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

// si son film

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

mais la durée est toujours 0. Je sais que la vidéo a une durée, car la durée est affichée dans le cadre du sous-titre lors de la sélection dans la bibliothèque de photos. Je comprends que la durée n'est pas toujours disponible mais dans ce cas la durée est affichée dans la photo lib. Je vérifie également la propriété contentURL et il a un bon rapport qualité-prix. Je suis capable de récupérer le fichier, obtenir sa taille de fichier, etc, donc je sais que le fichier NSURL du fichier est bon ...

Merci!

+1

Vous pouvez écouter le MPMovieDurationAvailableNotification. Cela nécessiterait que vous gardiez le MoviePlayer assez longtemps pour pouvoir déterminer la durée. La photothèque utilise probablement une valeur mise en cache. – omz

+0

@imobilizer Si la réponse ci-dessous a aidé, s'il vous plaît marquer est comme accepté. – memmons

Répondre

16

Je ne vois rien de mauvais avec votre code. Cependant, AVFoundation est beaucoup plus rapide pour ce type d'opération. Voici un extrait de code pour obtenir la durée en utilisant 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

Merci Harkonian, en fait ce code n'a pas fonctionné tout de suite. – imobilizer

+0

Merci @Harkonian, en fait ce code n'a pas fonctionné tout de suite car il y a un pointeur invalide à l'avertissement de conversion et quand je l'ai couru la ligne pour récupérer la durée reçue SIGABRT après avoir lancé NSException. Une fois l'ASSET créé, j'ai besoin de récupérer la durée comme suit: CMTime assetTime = [durée de l'actif]; Float64 duration = CMTimeGetSeconds (assetTime); – imobilizer

+0

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