내 프로젝트에서 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의 답변에 따라
: 나는 또한resumeAtTime
기능에
(player1.deviceCurrentTime + player1Time)
를 사용하여 시도
- (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];
}
. 그게 올바른 방법일까요? 또한 사용하려고 시도했습니다 player.currentTime/player1.rate
완전히 생각해야합니다. 일시 중지하려면 각 사운드를 캡처해야합니다 ** 사운드 **를 일시 중지합니다. 다시 시작하려면 해당 사운드의 시간 오프셋에 대해 playAtTime을 호출해야합니다. –
@DuncanC 감사합니다. –
'resumeAtTime' 메쏘드에서'[player1 setCurrentTime : player1Time]'을 사용하려고 시도했지만 작동하지 않습니다. 나는 그것에 대해 연구 중이다. –