2016-08-23 11 views
3

私は音楽プレーヤーアプリを開発しています。また、再生中に再生/一時停止ボタンとプログレスバーを使用します。 NSTimerを使ってプログレスバーを更新するメソッドを呼び出しています。私が必要とするのは、進行状況バーを一時停止し、中断したところから再開することです。NSTimer iOSのオーディオプレーヤーを一時停止/再生する目的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

ケタンの答えはよさそうだ。オーディオプレーヤーから現在の時刻を使用するだけです。再生するときに一時停止して起動するとタイマーが無効になります。 – Paulw11

答えて

1

私はそれを得ました!

私はちょうどポーズ機能で

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

とketanパーマーの回答

[audioPlayer setCurrentTime:rate]; 

をストーピングから参照してオーディオプレーヤーに現在の時間として設定を以下を追加します
rate = 0.0; 

レートはグローバルに宣言されたフロートです。 Ketan ..ありがとう!

2

何私はプロジェクトの私の1でやっている、

- (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; 

} 

私は遊びや一時停止のための共通のボタンがあり、それはちょうどそれがそれぞれplaypausenormal stateselected stateにタイトルだ変更。

は、だから私の方法では、 playPausesliderTimerは、 mySliderは進行状況を表示する UISliderオブジェクトが NSTimerオブジェクトであり、 audioPlayerAVAudioPlayerオブジェクトで、ボタンです。それでおしまい。あなたは私が言及したようにあなたのケースをいくつか管理することができます。

そして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]; 


} 

、ユーザーが手動でsliderChangedが呼び出されますと、あなたのプレイヤーがその時点で到達します、その後UISliderを変更した場合。

関連する問題