Player.duration всегда показывает ноль в MPMoviePlayerController для видеофайла

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

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

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

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

length = player.duration;

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

Я проверяю googling каждый раз, когда код, чтобы получить продолжительность видео, 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);

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

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

Ответ 1

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

Зарегистрировать изменения состояния загрузки:

[[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

SWIFT

Вы можете сделать это в быстро

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

        return CMTimeGetSeconds(duration)
    }

Ответ 3

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

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

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

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


 }

Ответ 4

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

NSURL *videoURL = [NSURL fileURLWithPath:VideoFileURL];

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

CMTime duration = sourceAsset.duration;

double durationInSeconds = duration.value/duration.timescale;

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