Использование пользовательского интерфейса для отслеживания продолжительности воспроизведения звукового файла

#iphone #objective-c #ios

#iPhone #objective-c #iOS

Вопрос:

Я проигрываю звуковой файл:

     AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];

NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/recordTest.caf", [[NSBundle mainBundle] resourcePath]]];
NSError *error;
audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:amp;error];
audioPlayer.numberOfLoops = 0;
[audioPlayer play];

sliderUpdater = [NSTimer scheduledTimerWithTimeInterval:1.0/10.0
                                                 target:self
                                               selector:@selector(sliderUpdateTimer)
                                               userInfo:nil
                                                repeats:YES];
  

Итак, звук воспроизводится, и я запускаю NSTimer, вызывающий мой метод sliderUpdateTimer.

Итак, метод заключается в

 - (void) sliderUpdateTimer
{                
NSLog(@"Dur: %f",audioPlayer.duration );
NSLog(@"Cur: %f",audioPlayer.currentTime );    
[seekSlider setValue:100 * (audioPlayer.duration) / (audioPlayer.currentTime)];
}
  

Длительность и текущее время оба кажутся равными 0.

Какую часть этого я делаю неправильно?

AudioPlayer.duration и currentTime возвращают NSTimerInterval, который, как я полагаю, является двойным.

Большое спасибо, -Code

Комментарии:

1. Я тоже никогда не мог заставить работать этот дурацкий слайдер, я пытался использовать его в игре, но он никогда не обновлялся корректно. В итоге я использовал функцию рисования — (void), чтобы создать свой собственный индикатор выполнения.

Ответ №1:

Эти комбинации отлично сработали для меня,

 -(IBAction)playAction
{
    paused = NO;
    [audioPlayer play];
    audioSlider.maximumValue = [audioPlayer duration];
    audioSlider.value = 0.0;

    [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTime:) userInfo:nil repeats:YES];
}

- (void)updateTime:(NSTimer *)timer
{
    audioSlider.value = audioPlayer.currentTime;
    audioTimer.text = [NSString stringWithFormat:@"%d", audioSlider.value];
}