如何在iOS中暂停audio及其定时器滑块?

我正在使用AVAudioPlayer类播放audio。 我已经实现了一个定时器滑块,随着音乐的播放而进行。

这是我的代码:

- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. AudioBool = YES; } - (IBAction)play:(id)sender { // Code to read the file from resource folder and sets it in the AVAudioPlayer // Sets the audio timer in 1 sec intervals sliderTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTime) userInfo:nil repeats:YES]; // Sets the slider maximum value slider.maximumValue = player.duration; // Sets the valueChanged target [slider addTarget:self action:@selector(sliderChanged : ) forControlEvents : UIControlEventValueChanged]; // Play the audio // [player prepareToPlay]; [player play]; if(AudioBool == YES) { [player play]; AudioBool = NO; } else { [player pause]; AudioBool = YES; } } - (void)updateTime { // Updates the slider about the music time slider.value = player.currentTime; NSString *time = [self timeFormatted:slider.value]; self.timerLabe.text = time; } - (NSString *)timeFormatted:(int)totalSeconds { int seconds = totalSeconds % 60; int minutes = (totalSeconds / 60) % 60; //int hours = totalSeconds / 3600; //return [NSString stringWithFormat:@"%02d:%02d:%02d",hours, minutes, seconds]; return [NSString stringWithFormat:@"%02d:%02d", minutes, seconds]; } - (IBAction)sliderChanged : (UISlider *)sender { // skips music with slider changged [player pause]; [player setCurrentTime:slider.value]; // [player prepareToPlay]; [player play]; } // Stops the timer when audio finishes - (void)audioPlayerDidFinishPlaying : (AVAudioPlayer *)player successfully : (BOOL)flag { // Music completed if (flag) { [sliderTimer invalidate]; } } 

我有两个问题:

  1. 我似乎无法暂停audio。 当我重新点击播放button时,它会在开始时重新启动audio,而不是暂停播放。

  2. 滑块也在开始时重新开始,而不是暂停。

我如何解决这些问题?

谢谢

尝试这个解决scheme,你需要做基本的play方法的变化..在viewDidLoad中移动滑块初始化也基于isPlaying属性播放/暂停(AudioBool属性在您的代码中)

 #import <AVFoundation/AVFoundation.h> @interface ViewController () @property (nonatomic, strong) AVAudioPlayer *audioPlayer; @property (nonatomic) BOOL isPlaying; @property (nonatomic, strong) NSTimer *sliderTimer; @property (weak, nonatomic) IBOutlet UISlider *slider; @property (weak, nonatomic) IBOutlet UILabel *timerLabel; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. NSBundle *mainBundle = [NSBundle mainBundle]; NSString *filePath = [mainBundle pathForResource:@"10101" ofType:@"mp3"]; NSURL *fileURL = [NSURL fileURLWithPath:filePath]; self.isPlaying = NO; NSError *error; self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:&error]; [self.audioPlayer prepareToPlay]; [self.slider addTarget:self action:@selector(sliderChanged:) forControlEvents:UIControlEventValueChanged]; self.slider.minimumValue = 0; self.slider.maximumValue = self.audioPlayer.duration; } - (IBAction)play:(id)sender { if (self.isPlaying) { // Music is currently playing [self.audioPlayer pause]; self.isPlaying = !self.isPlaying; } else { // Music is currenty paused/stopped [self.audioPlayer play]; self.isPlaying = !self.isPlaying; self.sliderTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTime) userInfo:nil repeats:YES]; } } - (void)sliderChanged:(UISlider *)sender { // skips music with slider changged [self.audioPlayer pause]; [self.audioPlayer setCurrentTime:self.slider.value]; [self.audioPlayer play]; } - (void)updateTime { // Updates the slider about the music time self.slider.value = self.audioPlayer.currentTime; NSString *time = [self timeFormatted:self.slider.value]; self.timerLabel.text = time; } - (NSString *)timeFormatted:(int)totalSeconds { int seconds = totalSeconds % 60; int minutes = (totalSeconds / 60) % 60; return [NSString stringWithFormat:@"%02d:%02d", minutes, seconds]; } // Stops the timer when audio finishes - (void)audioPlayerDidFinishPlaying : (AVAudioPlayer *)player successfully:(BOOL)flag { // Music completed if (flag) { [self.sliderTimer invalidate]; } }