繁体   English   中英

AVAudioPlayer在中断后从相同状态恢复音频剪辑

[英]AVAudioPlayer resume audio clips from the same state after interruption

我在项目中使用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本身做到这一点?

编辑:

根据Duncan 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];
     }

我还尝试在resumeAtTime函数中使用(player1.deviceCurrentTime + player1Time) 这是正确的方法吗? 我也尝试使用player.currentTime/player1.rate

文档没有明确说明play方法是从头开始播放声音还是在暂停后继续播放。 它只是说它在播放声音,因此建议从头开始播放。 您的发现表明它就是这样做的。

这就是我要做的。 在暂停声音之前,使用currentTime方法获取声音的播放点。

然后使用playAtTime在停止播放时恢复每个声音。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM