AVPlayer在iPhone上的中断时不会恢复播放,但会在iPad上播放

时间:2012-09-17 14:42:39

标签: iphone ios avplayer avaudiosession

我正在为iPhone和iPad编写一个收音机应用程序,并且在处理暂停和播放音频时会遇到一些奇怪的行为。我分别使用AVAudioSessionDelegate方法beginInterruptionendInterruption分别为pauseplay AVPlayer。以下是相关的play代码。

现在,以下情况似乎始终如一:

  1. 在iPad上:如果我强制中断(Facetime通话),则会按预期调用beginInterruption并停止播放。如果中断停止,则按预期调用endInterruption,并按预期恢复播放。
  2. 在iPhone上:按播放和暂停按钮,触发pauseplaybeginInterruptionendInterruption完全相同。播放按预期运行。
  3. 在iPhone上:强制中断(通过拨打电话),按预期调用endInterruption并按预期播放暂停。但是,当中断完成时,beginInterruption按预期调用,play按预期调用,它实际到达并执行[self.player play],但播放没有恢复!我什么都没听到。
  4. 上面的情况3非常奇怪,所以我想知道我是否可能忽视了某些事情。有什么想法吗?

    Play代码

    - (void)play { 
    NSError* error = nil;
    AVKeyValueStatus keyStatus = [currentAsset statusOfValueForKey:@"tracks" error:&error];
    if(error){
        DLog(@"Error %@", [error localizedDescription]);
    }
    else {
        DLog(@"Current Key Status: %i", keyStatus);
        if(keyStatus == AVKeyValueStatusLoaded){
            DLog(@"Continue playing source: %@", self.source);
            [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&error];
            if (error) {
                DLog(@"Error during play while setting AVAudioSessionCategory: %@", [error localizedDescription]);
            }
            [[AVAudioSession sharedInstance] setActive:YES error:&error];
            if (error) {
                DLog(@"Error during play while setting AVAudioSessionCategory: %@", [error localizedDescription]);
            }
            [[AVAudioSession sharedInstance] setDelegate:self];
            if(backgroundTaskID != UIBackgroundTaskInvalid){
                [[UIApplication sharedApplication] endBackgroundTask:backgroundTaskID];
            }
            backgroundTaskID = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL];
    
            [self.player play];
            [self setStatus:kNPOMediaPlayerStatusPlaying];
        }
        else {
            DLog(@"PlaySource: %@", self.source);
            [self playSource:self.source];
        }
    }}
    

2 个答案:

答案 0 :(得分:2)

我有同样的问题。实现远程控制事件处理后问题消失了。我在开始播放时拨打了[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

答案 1 :(得分:1)

事实证明,这是iOS中的已知错误,需要在applicationDidBecomeActive中进行一些仔细的解决方法来处理beginInterruption。可悲的是,我无法找到另一种解决方案。