gpt4 book ai didi

iOS 8 在 10 分钟后停止在后台播放音频

转载 作者:技术小花猫 更新时间:2023-10-29 10:47:10 25 4
gpt4 key购买 nike

我有一个应用程序可以播放来自 SHOUTcast 服务器的流式音频。当应用程序位于前台且禁用自动锁定时,一切正常。然而,该应用程序还可以在后台播放音频,此功能在 iOS 6 和 iOS 7 上一直运行良好。但现在我的用户报告说,在升级到 iOS 8 后大约 10 分钟后,背景音频停止。

我可以通过简单地在 iOS 8 上运行该应用程序来自己重现该问题。由于该应用程序本身非常复杂,我制作了一个简单的演示来展示该问题。我正在使用 Xcode 6 并且 Base SDK 设置为 iOS 8。我在我的 Info.plist 中将 audio 添加到 UIBackgroundModes。有人知道下面的代码有什么问题吗?

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSURL *streamingURL = [NSURL URLWithString:@"http://www.radiofmgold.be/stream.php?ext=pls"];

AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:streamingURL];
[self setPlayerItem:playerItem];

AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem];
[player setAllowsExternalPlayback:NO];

[self setPlayer:player];
[player play];

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
[[AVAudioSession sharedInstance] setActive: YES error: nil];

return YES;
}

最佳答案

我在 iOS 8.0.2 下遇到了同样的问题。我的远程音频源以 mp3 格式播放。似乎内部错误导致 AVAudioSession 重新启动。您可以用不同的方式处理它:

您可以观察 AVPlayerItem 的状态。

void* YourAudioControllerItemStatusContext = "YourAudioControllerItemStatusContext";
...
@implementation YourAudioController
...
- (void)playStream {
...
AVPlayerItem *item = [[AVPlayerItem alloc] initWithURL:streamUrl];
[item addObserver:self forKeyPath:@"status" options:0 context:MJAudioControllerItemStatusContext];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if (context == YourAudioControllerItemStatusContext) {
AVPlayerItem *item = object;
if (item.status == AVPlayerItemStatusFailed) {
[self recoverFromError];
}
}

这种方式似乎不可靠,因为在 AVPlayerItem 的状态发生变化之前可能存在巨大的时间延迟 - 如果它发生变化的话。

我通过 observeValueForKeyPath 进行调试,发现 AVPlayerItem 的状态更改为 AVErrorMediaServicesWereReset 并设置了错误代码 -11819

自从我遇到 AVErrorMediaServicesWereReset 错误后,我研究了导致此错误的原因 - 这是 AVAudioSession 变得疯狂。引用Technical Q&A从苹果你应该注册 AVAudioSessionMediaServicesWereResetNotifications。把它放在你的代码中的某个地方:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioSessionWasReset:) name:AVAudioSessionMediaServicesWereResetNotification object:nil];

然后添加这个方法:

- (void)audioSessionWasReset:(NSNotification *)notification {
[self recoverFromError];
}

在 recoverFromError 方法中尝试以下操作之一:

  • 显示一个警报,说明在 iOS 8 下存在问题,需要重新启动流
  • 通过再次激活 AVAudioSession 并使用新的 AVPlayerItem 实例化新的 AVPlayer 实例来重新启动流

目前,这是我唯一知道如何处理它的方法。问题是为什么 AudioSession 会重新启动。

更新iOS 8.1 的发布接缝解决了这个问题。

关于iOS 8 在 10 分钟后停止在后台播放音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26195722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com