0

我的应用程序使用 AVAudioPlayer 播放音乐文件。它还有一个 UISlider 来调整它在歌曲中播放的位置。然而,UISlider 有一个奇怪的错误,它似乎正在改变音频播放器的持续时间。

当一首歌曲开始时,作为该过程的一部分,值设置如下:

audioPlayer.currentTime = 0;
seekingSlider.maximumValue = [audioPlayer duration];
seekingSlider.value = audioPlayer.currentTime;

这没问题。然后我有一个更新playedTime 和 seekSlider 的NSTimer。这似乎也没有问题。当用户更改搜索时,然后转到以下seekingChanged功能。

- (IBAction)seekingChanged:(id)sender
{
    audioPlayer.currentTime = seekingSlider.value;
    [self updatePlayedTimeLabel:audioPlayer.currentTime];
}


- (void)updatePlayedTimeLabel:(NSTimeInterval)time {
    playedTime.text = [NSString stringWithFormat:@"%d:%02d", (int)time / 60, (int)time % 60, nil];
    [playedTime sizeToFit];
}

请注意,我绝不会写入 audioPlayer.duration。我只在开头和各种 NSLog 语句中阅读它来调试正在发生的事情。令我惊讶的是,它发生了变化。这是一首歌曲开头的一个示例输出,就在设置值之后:

after setting, seeking slider is at 0.000000 / 278.981384, audioplayer is at 0.000000 / 278.981375

这是另一个,在暂停 55 秒后:

pausing, seeking slider is at 55.884716 / 278.981384, audioplayer is at 55.946236 / 274.689354

audioPlayer 更改持续时间是否存在已知错误?当用户更改滑块并移动到下一首歌曲时,这表现为一个严重的错误,因为调用了 audioPlayerDidFinishPlaying。

4

1 回答 1

5

在某些压缩格式下,音频播放器可能会改变其对持续时间的估计,因为它通过播放(并因此解码)越来越多的歌曲来了解越来越多的歌曲。这里有一个类似的观察:

播放时音频播放器持续时间发生变化

我认为您需要调整滑块表示的持续时间,以匹配音频播放器对持续时间的了解的变化。

于 2013-04-28T16:44:44.593 回答