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

Posted

技术标签:

【中文标题】AVAudioPlayer 中断后从相同状态恢复音频剪辑【英文标题】:AVAudioPlayer resume audio clips from the same state after interruption 【发布时间】:2014-12-13 09:59:22 【问题描述】:

我在我的项目中使用 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

【问题讨论】:

您需要彻底考虑清楚这一点。要暂停,您需要捕获每个声音 currentTime 然后暂停声音。要恢复,您需要调用 playAtTime 以获得该声音的时间偏移量。 @DuncanC 谢谢,我会处理的。 我尝试在resumeAtTime 方法中使用[player1 setCurrentTime:player1Time],但这不起作用。我正在努力。 【参考方案1】:

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

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

然后使用 playAtTime 将每个声音恢复到它停止的时间。

【讨论】:

谢谢,请看看我有问题的编辑。

以上是关于AVAudioPlayer 中断后从相同状态恢复音频剪辑的主要内容,如果未能解决你的问题,请参考以下文章

使用AVAudioPlayer播放音乐文件无声音

android 在短信发送界面, 短信发送失败时,提示音不完整,会被中断

中断后CPU恢复执行的进程状态

AVAudioPlayer 使用 audioPlayerDecodeErrorDidOccur 中断播放,使用 NSOSStatusErrorDomain -50

即使 iPhone 处于静音状态,AVAudioPlayer 仍在播放环境声音

发生中断时如何让我的音频应用程序在后台保持活动状态?