2016-08-23 244 views
3

我正在开发音乐播放器应用程序。在播放音频时使用播放/暂停按钮和进度条。我正在调用NSTimer更新进度条的方法。我需要的是暂停进度条并在停止的地方恢复。暂停/播放带NSTimer iOS的音频播放器Objective C

我可以从链接所指的代码暂停计时器以及进度条: 1. How to pause a NSTimer? 2. How to Pause/Play NSTimer?

但我在恢复它在那里被II离开挣扎。我还需要根据音频更新进度条。

我的代码如下:

AVAudioPlayer *audioPlayer; 
NSTimer *audioTimer; 
BOOL play; 

BOOL ispaused; 
int seconds1; 
int minutes1; 
int hours1; 

NSDate *pauseStart, *previousFireDate; 

播放/暂停按钮动作:

- (IBAction)playSoundTapped:(id)sender 
{ 
songUrl = [NSURL URLWithString:@"http://www.stephaniequinn.com/Music/Allegro%20from%20Duet%20in%20C%20Major.mp3"]; 

self.playerItem = [AVPlayerItem playerItemWithURL:songUrl]; 
self.player = [AVPlayer playerWithPlayerItem:self.playerItem]; 
self.player = [AVPlayer playerWithURL:songUrl]; 

if (play==YES) 
{ 
    if (ispaused == YES) 
    { 
     float pauseTime = -1*[pauseStart timeIntervalSinceNow]; 
     [audioTimer setFireDate:[NSDate dateWithTimeInterval:pauseTime sinceDate:previousFireDate]]; 
     audioTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateProgress) userInfo:nil repeats:YES]; 

     [self.player play]; 

     ispaused = NO; 
    } 
    else 
    { 
     audioTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateProgress) userInfo:nil repeats:YES]; 

     [self.player play]; 

     ispaused = NO; 
    } 

    _playImg.image=[UIImage imageNamed:@"Pause.png"]; 
    play=NO; 
} 
else 
{ 
    [self.player pause]; 

    ispaused = YES; 

    pauseStart = [NSDate dateWithTimeIntervalSinceNow:0]; 
    previousFireDate = [audioTimer fireDate]; 
    [audioTimer setFireDate:[NSDate distantFuture]]; 

    _playImg.image=[UIImage imageNamed:@"Play.png"]; 
    play=YES; 
} 
} 

更新进度:

- (void)updateProgress 
{ 
    if (ispaused == NO) 
    { 
     seconds1 += 1; 

    if (seconds1 == 60) 
    { 
     seconds1 = 0; 
     minutes1++; 

     if (minutes1 == 60) 
     { 
      minutes1 = 0; 
      hours1++; 
     } 
    } 

    float duration = CMTimeGetSeconds([_playerItem duration]); 
    float actDuration = duration/100; 
    float currentTime = CMTimeGetSeconds([_player currentTime]); 
    float minutes = currentTime/60; 
    //float seconds = (currentTime - minutes) * 60; 
    NSLog(@"Duration: %.2f",actDuration); 
    NSLog(@"Current Time: %.2f",minutes); 

    NSString *durStr = [NSString stringWithFormat: @"%f",duration]; 

    if ([durStr isEqual: @"nan"]) 
    { 
     NSLog(@"Nan"); 
    } 
    else 
    { 
     [self setProgress:minutes animated:YES]; 
    } 
} 
else 
{ 
     NSLog(@“Paused”);   
} 
} 

它正在重新启动音频而不是恢复。由于我是iOS的初学者,我不知道自己在做什么错误。 任何人都可以帮助我......。?

+0

您不需要使用当前时间或记录暂停时间。简单地增加音频运行时的流逝时间,而不是暂停时间。 – Paulw11

+0

@ Paulw11你可以分享我使用它的示例代码吗? –

+1

Ketan的答案看起来不错。您只需使用音频播放器中的当前时间。当你暂停播放时启动播放器并启动播放器 – Paulw11

回答

1

我明白了!

我只是添加下面的暂停功能

rate = CMTimeGetSeconds([_player currentTime])/60; 

和回采时,将其设置为当前时间与来自科坦帕默的回答

[audioPlayer setCurrentTime:rate]; 

参考音频播放器和

rate = 0.0; 

费率是一个全局声明的浮点数。感谢Ketan ..!

2

我在我的一个项目在做什么,

- (void)playPauseAudio : (UIButton*)sender{ 

if (!playPause.selected) { 


    [audioPlayer play]; 

    sliderTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateSlider) userInfo:nil repeats:YES]; 
    [mySlider addTarget:self action:@selector(sliderChanged:) forControlEvents:UIControlEventValueChanged]; 
    mySlider.maximumValue = audioPlayer.duration; 

} 
else{ 

    [audioPlayer pause]; 
    [sliderTimer invalidate]; 
} 



playPause.selected = !playPause.selected; 

} 

我有播放和暂停按钮常见,它只是改变它的标题上normal stateselected stateplaypause分别。

所以在我的方法,playPause是按钮,audioPlayerAVAudioPlayer对象,sliderTimerNSTimer对象,mySliderUISlider对象以显示进度。而已。正如我所提到的,你可以管理你的案例。

而且updateSlidersliderChanged方法是一样的东西下面,

- (void)updateSlider{ 

mySlider.value = audioPlayer.currentTime; 
timerLabel.text = [self timeFormatted:audioPlayer.duration - audioPlayer.currentTime]; 
NSLog(@"update slider call"); 

} 

- (void)sliderChanged : (UISlider*) sender{ 


[audioPlayer setCurrentTime:mySlider.value]; 
timerLabel.text = [self timeFormatted:audioPlayer.duration - mySlider.value]; 


} 

所以,如果用户手动更改UISlider然后sliderChanged将调用和您的播放器将在此时达到。