我在我的項目中使用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
你需要徹底思考這個問題。要暫停,您需要捕獲每個聲音currentTime **,然後暫停聲音**。要恢復,您需要爲該聲音的時間偏移調用playAtTime。 – 2014-12-13 17:44:22
@DuncanC謝謝,我會通過這個。 – 2014-12-15 10:00:26
我曾嘗試在'resumeAtTime'方法中使用'[player1 setCurrentTime:player1Time]',但這不起作用。我在做這個工作。 – 2014-12-15 10:05:04