2014-12-13 68 views
0

我在我的項目中使用AVAudioPlayer實例來按順序播放背景音樂剪輯和語音音頻剪輯。我必須將音頻與顯示的動畫同步。除了在諸如呼叫之類的中斷之後的場景(即)之外,它工作得很好。如果中斷開始,動畫將暫停,如果結束,它將被恢復,音頻應該以相同的方式,以便它可以完美地同步。AVAudioPlayer在中斷後恢復來自同一狀態的音頻剪輯

我用AVAudioPlayer的委託方法,其中斷期間被調用,

- (void) audioPlayerBeginInterruption: (AVAudioPlayer *) player { 
    [self pauseAllPlayers]; 
} 

- (void) audioPlayerEndInterruption: (AVAudioPlayer *) player withOptions:(NSUInteger) flags{ 
    [self playAllPlayers]; 
} 

-(void)pauseAllPlayers 
{ 
if(musicPlayer1) 
[musicPlayer1 pause]; 
if(musicPlayer2) 
[musicPlayer2 pause]; 
// ... paused all players the similar way 
} 

-(void)playAllPlayers 
{ 
if(musicPlayer1) 
[musicPlayer1 play]; 
// .. played all players the similar way 
} 

我還設置委託自我。它工作正常,但音頻剪輯在中斷後沒有從相同的狀態恢復,它從頭開始播放剪輯。我也曾嘗試以下操作:

1)

- (void)endInterruptionWithFlags:(NSUInteger)flags { 
    if (flags) { 
     if (AVAudioSessionInterruptionFlags_ShouldResume) { 
       dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1), dispatch_get_main_queue(), ^{ 
        [self playAllPlayers]; 
       }); 
     } 
    } 
} 

2)

- (void) audioPlayerEndInterruption: (AVAudioPlayer *) player withOptions:(NSUInteger) flags{ 
     [NSTimer scheduledTimerWithTimeInterval:0.3 target:self selector:@selector(resumeBG) userInfo:nil repeats:NO]; 
     [musicPlayer1 play]; 
} 

-(void) resumeBG 
{ 
    [musicPlayer2 play]; // This is the player that plays background music. 
} 

3)

- (void) audioPlayerBeginInterruption: (AVAudioPlayer *) player { 
     [self stopAllAudioPlayers]; 
    } 

    - (void) audioPlayerEndInterruption: (AVAudioPlayer *) player withOptions:(NSUInteger) flags{ 
     [self playAllPlayers]; 
    } 

-(void) stopAllAudioPlayers 
{ 
if(musicPlayer1) 
[musicPlayer1 stop]; 
if(musicPlayer2) 
[musicPlayer2 stop]; 
//... 
} 

但這些都不工作。當中斷開始時,我需要從同一狀態恢復BG和語音音頻片段。有沒有辦法與AVAudioPlayer本身做到這一點?

編輯:

基於鄧肯C'S答案我已經試過如下:

- (void) audioPlayerBeginInterruption: (AVAudioPlayer *) player { 
     [self storeTime]; 
    } 

    - (void) audioPlayerEndInterruption: (AVAudioPlayer *) player withOptions:(NSUInteger) flags{ 
     [self resumeAtTime]; 
    } 

    - (void) storeTime 
    { 
     player1Time = [player1 currentTime]; 
     player2Time = [player2 currentTime]; 
    } 
    -(void) resumeAtTime 
    { 
     [player1 playAtTime:player1Time]; 
     [player2 playAtTime:player2Time]; 
    } 

我在resumeAtTime功能使用(player1.deviceCurrentTime + player1Time)也試過。這是正確的方式嗎?我也嘗試過使用player.currentTime/player1.rate

+1

你需要徹底思考這個問題。要暫停,您需要捕獲每個聲音currentTime **,然後暫停聲音**。要恢復,您需要爲該聲音的時間偏移調用playAtTime。 – 2014-12-13 17:44:22

+0

@DuncanC謝謝,我會通過這個。 – 2014-12-15 10:00:26

+0

我曾嘗試在'resumeAtTime'方法中使用'[player1 setCurrentTime:player1Time]',但這不起作用。我在做這個工作。 – 2014-12-15 10:05:04

回答

1

如果播放方法從一開始播放聲音或在暫停後繼續播放,則文檔不會說清楚。它只是說它播放聲音,其中建議從一開始播放。你的發現表明這就是它的作用。

這是我會做的。在暫停它們之前,使用currentTime方法獲取您的聲音的播放點。

然後使用playAtTime在停止播放時恢復每個聲音。

+0

謝謝,請看看我的編輯問題。 – 2014-12-13 14:03:25