播放时audio播放器的持续时间会改

在播放audio文件的持续时间之前:

audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error]; ... [audioPlayer prepareToPlay]; duration = audioPlayer.duration; 

我得到一个例如16.71s的持续时间。 然后在播放时每隔0.2秒取样,持续时间会改变。 它每1.2到1.6秒改变一次:16.71s,17.02s,17.23s,17.3s,17.3s,17.4s,17.3s,17.29s,17.3s,然后在最后2.5s停留在17.5s。 所以它上升和下降。

我在一个更新滑块位置的方法中进行采样,并显示已用时间和总持续时间。 你可以想象看起来真的很奇怪,看看持续时间(这是整数截断)从16岁到17岁。 此外,滑块的位置将随着所有漂移而closures。

有没有人有一个想法,为什么这是?

现在我们正在讨论的持续时间:有没有人知道为什么audio player.duration可以返回大约是[audioPlayer prepareToPlay]被省略的实际持续时间的两倍的值?

avaudioplayer持续时间方法返回的持续时间是根据文件已经被解码到目前为止的总持续时间的最佳估计。 这就是为什么随着时间的推移,持续时间会持续得到改善。

为了获得更好的时间,我使用AVAsset的持续时间方法。 这里解释一下什么更好:

https://developer.apple.com/library/mac/documentation/AVFoundation/Reference/AVAsset_Class/Reference/Reference.html#//apple_ref/occ/instp/AVAsset/duration

如果指定providePreciseDurationAndTiming = YES,那么AVAsset会根据需要对文件进行解码,以确定其持续时间。 如果解码时间太长,您可以禁用它。

在我的情况下,我使用AVURLAsset子类:

  AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:localURL options:[NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], AVURLAssetPreferPreciseDurationAndTimingKey, nil]]; float t = CMTimeGetSeconds(asset.duration);