AVAudioPlayer 持续时间改变

use*_*419 0 avaudioplayer uislider ios

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

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

audioPlayer.currentTime = 0;
seekingSlider.maximumValue = [audioPlayer duration];
seekingSlider.value = audioPlayer.currentTime;
Run Code Online (Sandbox Code Playgroud)

这没有问题。然后我有一个 NSTimer 来更新 playTime 和 seekSlider。这似乎也没有问题。当用户更改搜索时,将转到以下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];
}
Run Code Online (Sandbox Code Playgroud)

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

after setting, seeking slider is at 0.000000 / 278.981384, audioplayer is at 0.000000 / 278.981375
Run Code Online (Sandbox Code Playgroud)

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

pausing, seeking slider is at 55.884716 / 278.981384, audioplayer is at 55.946236 / 274.689354
Run Code Online (Sandbox Code Playgroud)

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

mat*_*att 5

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

播放时音频播放器持续时间更改

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