【问题标题】:Paused audio starts playing automatically on applicationWillEnterForeground:暂停的音频开始在 applicationWillEnterForeground 上自动播放:
【发布时间】:2023-11-03 12:10:01
【问题描述】:

applicationDidEnterBackground: 触发时,我暂停正在使用AVAudioPlayer 播放的音频:

[self.avPlayer pause];

现在,当applicationWillEnterForeground: 触发时,音频开始自动播放!由于我没有启动音频,所以用户界面没有更新,显示音频仍处于暂停状态。

发生了什么事?这发生在 iPad 2 上的 iOS 6.x 中。此问题不会在运行 iOS 5.x 的旧 iPad 上重现。

这就是我设置AVAudioSession的方式:

// Setup the audio session
BOOL succeeded = NO;
NSError *sessionError = nil;
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setDelegate:self];

if ([session respondsToSelector:@selector(setPreferredSampleRate:error:)]) {
    succeeded = [session setPreferredSampleRate:128000.0f error:&sessionError];

} else {
    succeeded = [session setPreferredHardwareSampleRate:128000.0f error:&sessionError];
}

succeeded = [session setCategory:AVAudioSessionCategorySoloAmbient error:&sessionError];
succeeded = [session setActive:YES error:&sessionError];

【问题讨论】:

  • 你为什么不做 [self.avPlayer pause];再次在 applicationWillEnterForeground: ?
  • 你到底在哪里使用这个代码?
  • 这是一种糟糕的尝试解决方案(在我看来)。话虽如此,:)我实际上确实尝试过,但它不起作用!我不知道这里有什么魔法。
  • AVAudioSession 在应用程序启动时设置。

标签: ios avaudioplayer avaudiosession


【解决方案1】:

在我最近的一个应用程序中,我发现了一个类似的问题,即音频播放自动暂停并在您被呼叫打断后恢复,并且我的应用程序中的 GUI 没有刷新。我已经使用以下方法解决了这个问题:

在你处理播放器代码的类中注册这个

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

并在应用程序恢复后使用AVAudioSessionaudioPlayerEndInterruption委托方法获得控制权。在此功能中,您可以恢复播放并相应地更新 UI。

- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player withOptions:(NSUInteger)flags

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    我发现了一些奇怪的用户体验,当我在后台来回切换时,根据一堆帖子,我打算稍微摇晃一下手柄。我做了一些相当简单的事情 - 检查应用程序进入前台时是否正在播放其他音乐:

        func applicationWillEnterForeground(application: UIApplication) {
             if AVAudioSession.sharedInstance().otherAudioPlaying{                 
    NSNotificationCenter.defaultCenter().postNotificationName(Notifications.ForegroundEnteredWithOtherAudioPlaying, object: nil)
             }
        }
    

    如果是这样,您可以在收到通知时暂停播放器。您提到这不起作用,但没有看到您的其余代码,很难知道原因。

    我必须做的另一件事是从播放器项目中删除status 标志的观察者,因为我会在ReadyToPlay 值上听我告诉AvPlayer 实际播放的值。当应用程序进入前台并且有一个活动的音频会话时,它会被触发。因此,通过在暂停时移除该观察者并在每次播放时设置它,(这并不疯狂,因为我认为说我只关心在播放后观察是一个可以的约束),我能够控制很多怪事。

    我还写了一堆测试用例,我将在这里分享,以确保您的体验状态良好。不全面,但也相当彻底。

        // 1. Play, leave app, don't open anything else, come back
        // 2. Play, leave app, open an app that plays music, come back
        // 3. Play, leave app, open an app that plays music, play music, come back
        // 4. Play, let audio go for 5 seconds, pause, open an app that plays music, come back
        // 5. Play, let audio go for 5 seconds, pause, open an app that plays music, play music, come back
        // 6. Press play, leave app before playback starts, open an app that plays music, come back
        // 7. Crazy s$*t like play, leave app, open an app that plays music, play music, come back, tap a different song 
    

    【讨论】:

      【解决方案3】:

      HRM 的解决方案对我不起作用。我避免自动恢复播放的唯一方法是使用 stop: [self.avPlayer stop]

      【讨论】:

      • AVPlayer 中没有“stop”这样的调用
      【解决方案4】:

      我也遇到了同样的问题。因此,我为 UIApplicationWillResignActive 注册了我的课程,并在收到通知时暂停了音频。

      【讨论】:

        【解决方案5】:

        2020,还没有解决办法?

        关于这个荒谬的问题。这似乎是 iOS 中的一个普通错误。

        我们能找到的唯一真正的解决方案

        在所有三个委托调用中..

        func applicationWillResignActive(_ application: UIApplication) {
            yourPlayer.handleAppResign()
        }
        
        func applicationDidEnterBackground(_ application: UIApplication) {
            yourPlayer.handleAppResign()
        }
        
        func applicationWillTerminate(_ application: UIApplication) {
            yourPlayer.handleAppResign()
        }
        

        那么在你处理特定情况的地方,你会:

        func ...handleThat() {
            yourAVPlayer?.rate = 0
        }
        

        其实只要加上这个:

        func ...handleThat() {
            yourAVPlayer?.rate = 0
            yourAVPlayer = nil
        }
        

        通常你不会这样做,因为你通常只是暂停。

        但事实上,这似乎是解决疯狂的“Apple 自动取消暂停”行为的唯一方法。

        好像没有别的办法了。

        【讨论】:

          最近更新 更多