MPMoviePlayerController - Продолжительность всегда 0 - PullRequest
8 голосов
/ 12 мая 2011

iPhone4, iOS 4.3.3, iOS SDK4.3

Привет всем,

Я создаю функцию загрузки видео. Видео извлекается с помощью UIImagePickerController и может быть захвачено с помощью камеры или выбрано из библиотеки фотографий. У меня есть ограничение приложения длительностью 60 секунд. Это легко достигается при записи видео с помощью камеры через:

// Ограничение видео до 60 секунд

[подборщик setVideoMaximumDuration: 60];

Однако, когда видео выбрано из библиотеки фотографий, единственный способ получения длительности - использовать свойство длительности MPMoviePlayerController следующим образом:

// MediaType может быть kUTTypeImage или kUTTypeMovie.

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

// если это фильм

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

однако длительность всегда равна 0. Я знаю, что у видео есть продолжительность, потому что продолжительность отображается как часть субтитра при выборе его в библиотеке фотографий. Я понимаю, что продолжительность может быть не всегда доступна, но в этом случае продолжительность отображается в фотобиблиотеке. Я также проверяю свойство contentURL, и оно имеет хорошее значение. Я могу получить файл, получить его размер и т. Д., Поэтому я знаю, что NSURL файла хорош ...

Спасибо!

1 Ответ

16 голосов
/ 13 мая 2011

Я не вижу ничего плохого в вашем коде. Однако использование AVFoundation намного быстрее для этого типа операций. Вот фрагмент кода для получения длительности с использованием 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) ;
...