2014-12-13 2 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의 답변에 따라

: 나는 또한 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

+1

완전히 생각해야합니다. 일시 중지하려면 각 사운드를 캡처해야합니다 ** 사운드 **를 일시 중지합니다. 다시 시작하려면 해당 사운드의 시간 오프셋에 대해 playAtTime을 호출해야합니다. –

+0

@DuncanC 감사합니다. –

+0

'resumeAtTime' 메쏘드에서'[player1 setCurrentTime : player1Time]'을 사용하려고 시도했지만 작동하지 않습니다. 나는 그것에 대해 연구 중이다. –

답변

1

재생 방법이 처음부터 소리를 재생하는지 또는 일시 중지 후에도 계속되는지는 확실하지 않습니다. 은 처음부터 재생을 제안하는입니다. 귀하의 연구 결과는 그것이 무엇을 의미합니다.

다음은 내가 수행 할 작업입니다. 일시 정지하기 전에 사운드의 재생 지점을 가져 오려면 currentTime 메서드를 사용하십시오.

그런 다음 playAtTime을 사용하여 각 사운드를 일시 중지 한 시점부터 다시 시작하십시오.

+0

감사합니다. 제 편집 내용을 살펴보십시오. –

관련 문제