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?

EDIT:

На основании ответа Дункана C, я попытался следующие:

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

Я также попытался с помощью (player1.deviceCurrentTime + player1Time) в resumeAtTime функции. Это правильный способ сделать это? Также я попытался использовать player.currentTime/player1.rate

+1

Вам нужно полностью обдумать это. Чтобы сделать паузу, вам нужно записать каждый звук currentTime **, а затем приостановить звук **. Чтобы возобновить работу, вам необходимо вызвать playAtTime для смещения времени этого звука. –

+0

@ DuncanC Спасибо, я пройду через это. –

+0

Я попытался использовать '[player1 setCurrentTime: player1Time]' в 'resumeAtTime', но это не работает. Я работаю над этим. –

ответ

1

Документы не дают понять, если метод воспроизведения воспроизводит звук с самого начала или продолжается после паузы. Он просто говорит, что он играет звук, который предлагает играет с самого начала. Ваши выводы говорят о том, что это так.

Вот что я хотел бы сделать. Используйте метод currentTime, чтобы получить точку воспроизведения для вашего звука (ов), прежде чем приостанавливать их.

Затем используйте playAtTime для возобновления каждого звука в момент его остановки.

+0

Спасибо, пожалуйста, посмотрите мое редактирование. –

 Смежные вопросы

  • Нет связанных вопросов^_^