Если вам не нужна большая точность и вы хотите придерживаться AVAudioPlayer
, это один из вариантов:
- (void)playAtTime:(NSTimeInterval)time withDuration:(NSTimeInterval)duration {
NSTimeInterval shortStartDelay = 0.01;
NSTimeInterval now = player.deviceCurrentTime;
[self.audioPlayer playAtTime:now + shortStartDelay];
self.stopTimer = [NSTimer scheduledTimerWithTimeInterval:shortStartDelay + duration
target:self
selector:@selector(stopPlaying:)
userInfo:nil
repeats:NO];
}
- (void)stopPlaying:(NSTimer *)theTimer {
[self.audioPlayer pause];
}
Имейте в виду, что stopTimer
будет запускаться в цикле выполнения потока, поэтому будет существовать некоторая изменчивость продолжительности воспроизведения звука, в зависимости от того, что еще приложение делает в данный момент. Если вам нужен более высокий уровень точности, рассмотрите возможность использования AVPlayer
вместо AVAudioPlayer
. AVPlayer
воспроизводит AVPlayerItem
объектов, которые позволяют указать forwardPlaybackEndTime
.