音频播放器持续时间在播放

时间:2013-04-26 22:21:24

标签: iphone ios avaudioplayer

当我播放音频文件的持续时间之前:

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]时实际持续时间两倍的值吗?

1 个答案:

答案 0 :(得分:4)

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);