私のアプリは、AVAudioPlayer を使用して音楽ファイルを再生します。また、曲のどこを再生するかを調整するための UISlider もあります。ただし、UISlider には、audioPlayer のデュレーションを変更しているように見える奇妙なバグがあります。
曲が開始されると、プロセスの一部として、値が次のように設定されます。
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 が呼び出されるため、ユーザーがスライダーを変更して次の曲に移動すると、悪いバグとして現れます。