如何在iOS中暂停音频及其计时器滑块?

时间:2015-01-15 18:19:05

标签: ios objective-c

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

这是我的代码:

- (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. 我似乎无法暂停音频。当我重新点击播放按钮时,它会在开始时重新启动音频而不是暂停它。

  2. 滑块也会在开头重新启动而不是暂停。

  3. 如何解决这些问题?

    由于

1 个答案:

答案 0 :(得分:3)

尝试这个解决方案,你需要在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];
    }
}