player.duration всегда показывает ноль в MPMoviePlayerController для видеофайла - PullRequest
11 голосов
/ 27 января 2012

Я играю небольшое видео в контроллере mpmediaplayer, используя этот код

MPMoviePlayerController *player = [[MPMoviePlayerController alloc] 
                                   initWithContentURL:[NSURL fileURLWithPath:videostr]]; 

, где videostr - путь к этому видеофайлу.

Теперь мне нужно получить длину этого видеофайла длячто я использую этот код.

length = player.duration;

Но он всегда показывает 0,000.Но видео играет хорошо.

Я проверяю, прибегая к поиску, где каждый код для получения продолжительности видео player.duration.

И я пробую другой код также

AVURLAsset *asset = [[[AVURLAsset alloc] initWithURL:[NSURL fileURLWithPath:videostr] 
                                             options:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], AVURLAssetPreferPreciseDurationAndTimingKey, nil]] autorelease];
NSTimeInterval duration; 
if (asset) 
    duration = CMTimeGetSeconds(asset.duration) ;
NSLog(@">>>>>>>>>>>>>>>>>>>> %f", asset.duration);

, даже если он показываетМожет ли кто-нибудь, пожалуйста, помогите мне.

Спасибо заранее.

Ответы [ 4 ]

22 голосов
/ 28 января 2012

Вы не можете получить полезную продолжительность до тех пор, пока контент фактически не будет воспроизводиться.

Регистрация изменений состояния загрузки:

[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(MPMoviePlayerLoadStateDidChange:) 
                                             name:MPMoviePlayerLoadStateDidChangeNotification 
                                           object:nil];

Оценить состояние после получения уведомления:

- (void)MPMoviePlayerLoadStateDidChange:(NSNotification *)notification
{
    if ((player.loadState & MPMovieLoadStatePlaythroughOK) == MPMovieLoadStatePlaythroughOK)
    {
        NSLog(@"content play length is %g seconds", player.duration);
    }
}
2 голосов
/ 09 марта 2015

SWIFT

Вы можете сделать в swift вот так

func getMediaDuration(url: NSURL!) -> Float64{
        var asset : AVURLAsset = AVURLAsset.assetWithURL(url) as AVURLAsset
        var duration : CMTime = asset.duration

        return CMTimeGetSeconds(duration)
    }
1 голос
/ 30 марта 2015

использовать MPMovieDurationAvailableNotification

[[NSNotificationCenter defaultCenter] addObserver:self 
                                     selector:@selector(movieDurationAvailable:) 
                                         MPMovieDurationAvailableNotification object:nil];

- (void)movieDurationAvailable:(NSNotification *)notification {

        NSLog(@"content play length is %g seconds", moviePlayer.duration);


 }
0 голосов
/ 15 сентября 2015

Вы можете извлечь длительность из видеофайла, используя следующий код.

NSURL *videoURL = [NSURL fileURLWithPath:VideoFileURL];

AVURLAsset *sourceAsset = [AVURLAsset URLAssetWithURL:videoURL options:nil];

CMTime duration = sourceAsset.duration;

double durationInSeconds = duration.value/duration.timescale;

В переменной durationInSeconds вы получите точную продолжительность в секундах.

...