0

私のアプリは、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 が呼び出されるため、ユーザーがスライダーを変更して次の曲に移動すると、悪いバグとして現れます。

4

1 に答える 1

5

特定の圧縮形式では、オーディオ プレーヤーは、曲を再生 (およびデコード) することで曲について学習するにつれて、継続時間の推定値を変更する場合があります。ここにも同様の観察があります:

再生中にオーディオ プレーヤーのデュレーションが変化する

持続時間に関するオーディオ プレーヤーの変更に合わせて、スライダーで表される持続時間を調整する必要があると思います。

于 2013-04-28T16:44:44.593 に答える