Я использую экземпляры 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
Вам нужно полностью обдумать это. Чтобы сделать паузу, вам нужно записать каждый звук currentTime **, а затем приостановить звук **. Чтобы возобновить работу, вам необходимо вызвать playAtTime для смещения времени этого звука. –
@ DuncanC Спасибо, я пройду через это. –
Я попытался использовать '[player1 setCurrentTime: player1Time]' в 'resumeAtTime', но это не работает. Я работаю над этим. –