AVPlayer物品获得一个持续时间

我正在播放一个文件。 来自url的MP3stream。 我正在使用AVPlayer,当我试图获得总时间来build立一个进度条,我得到时间是南。

NSError *setCategoryError = nil; if ([ [AVAudioSession sharedInstance] isOtherAudioPlaying]) { // mix sound effects with music already playing [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategorySoloAmbient error:&setCategoryError]; } else { [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:&setCategoryError]; } if (setCategoryError) { NSLog(@"Error setting category! %ld", (long)[setCategoryError code]); } NSURL *url = [NSURL URLWithString:@"http://..//46698"]; AVPlayer *player = [AVPlayer playerWithURL:url]; songPlayer=player; [songPlayer addObserver:self forKeyPath:@"status" options:0 context:nil]; - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if (object == songPlayer && [keyPath isEqualToString:@"status"]) { if (songPlayer.status == AVPlayerStatusFailed) { NSLog(@"AVPlayer Failed"); } else if (songPlayer.status == AVPlayerStatusReadyToPlay) { NSLog(@"AVPlayerStatusReadyToPlay"); [songPlayer play]; [songPlayer addPeriodicTimeObserverForInterval:CMTimeMake(1, 1) queue:dispatch_get_main_queue() usingBlock:^(CMTime time){ CMTime aux = [songPlayer currentTime]; AVPlayerItem *item=[songPlayer currentItem]; CMTime dur=[item duration]; NSLog(@"%f/%f", CMTimeGetSeconds(aux), CMTimeGetSeconds(dur)); }]; } else if (songPlayer.status == AVPlayerItemStatusUnknown) { NSLog(@"AVPlayer Unknown"); } } } 

我已经尝试了一切。

 [item duration]; /// Fail [[item asset] duration]; /// Fail 

并没有什么工作

任何人知道为什么

duration属性的值将被报告为kCMTimeIndefinite直到基础资产的持续时间被加载。 有两种方法可以确保持续时间的值只有在可用时才被访问:

  1. 等到AVPlayerItem的状态是AVPlayerItemStatusReadyToPlay

  2. 注册duration属性的键值观察,请求初始值。 如果初始值被报告为kCMTimeIndefiniteAVPlayerItem一旦知道它的值就会通过键值观察通知你项目持续时间的可用性。

我有同样的问题,但我能用不同的方法获得持续时间。 请参阅我的答案在这里: https : //stackoverflow.com/a/38406295/3629481