当我播放音频文件的持续时间之前:
audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
...
[audioPlayer prepareToPlay];
duration = audioPlayer.duration;
我的持续时间为16.71秒。然后在播放时每0.2秒采样一次,持续时间会发生变化。它每1.2到1.6秒变化:16.71s,17.02s,17.23s,17.33s,17.38s,17.43s,17.38s,17.29s,17.31s,然后在最后2.5秒内保持在17.51s。所以它上下起伏。
我在一个更新滑块位置的方法中进行采样,并显示已用时间和总持续时间。你可以想象看到持续时间(int-truncated)在播放时从16到17变得非常奇怪。此外,滑块位置将在所有这些漂移时关闭。
有谁知道为什么会这样?
现在我们讨论的是持续时间:有人知道为什么audio player.duration
可以返回大约是省略[audioPlayer prepareToPlay]
时实际持续时间两倍的值吗?
答案 0 :(得分:4)
avaudioplayer持续时间方法返回的持续时间是对文件总持续时间的最佳估计,这取决于到目前为止已经解码了多少文件。这就是为什么随着时间的推移,持续时间会不断变化。
为了获得更好的时间,我使用了AVAsset的持续时间方法。它解释了这里有什么好转:
如果指定providePreciseDurationAndTiming = YES,则AVAsset将根据需要对文件进行解码,以准确确定其持续时间。如果解码时间太长,您可以将其禁用。
在我的情况下,我使用AVURLAsset子类:
AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:localURL options:[NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], AVURLAssetPreferPreciseDurationAndTimingKey, nil]];
float t = CMTimeGetSeconds(asset.duration);