2014-10-04 183 views
10

我有一個應用程序可以播放來自SHOUTcast服務器的流音頻。當應用程序位於前臺且禁用自動鎖定時,一切正常。然而,該應用程序也能夠在後臺播放音頻,該功能在iOS 6和iOS 7上一直運行良好。但現在,我的用戶報告說,在升級到iOS 8後大約10分鐘後,背景音頻會停止。iOS 8在10分鐘後停止在後臺播放音頻

我可以通過在iOS 8上運行應用程序來自己重現問題。由於應用程序本身非常複雜,我已經做了一個簡單的演示來展示問題。我使用Xcode 6,Base SDK設置爲iOS 8.我在Info.plist中添加了音頻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; 
} 
+0

請分享修復,如果你找到一個。我的用戶也在報告這個問題。我無法複製它。 – RawMean 2014-10-06 14:42:00

+0

由於所有流式鏈接均未出現問題,因此我也無法首先重現該問題。然而,我的代碼中的流在10分鐘後總是停止,而它在iOS 7上正常工作。 真的很煩人,因爲這個流是我的應用程序的主要功能,我現在用一星級的評論和來自用戶的抱怨不知所措。儘快設置這個問題的賞金,但恐怕這是蘋果方面的一個錯誤。 我真的希望我可以自己修復它..雖然我的應用程序基本上依賴於此功能。 – s1m0n 2014-10-06 17:26:01

+0

嗨,大家好,我遇到了同樣的問題。對我來說就像蘋果公司搞砸了它。在我的情況下,直到河流停止播放的時間差異很大(5分鐘到12分鐘)。看起來流突然失去連接,然後播放,直到它用完緩衝數據。 App在前臺以及在後臺時會發生。處理它的唯一方法是觀察AVPlayerItem的狀態。我會將其作爲答案發布。 – Hendrik 2014-10-07 08:03:19

回答

6

我在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瘋了。參考Apple的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重新啓動。

UPDATE iOS 8.1接縫的發佈解決了問題。

5

我也遇到了同樣的問題,並測試了在iPhone 5S運行iOS 8.0.2和iPad的迷你視網膜運行的iOS 8.1 beta 2版本,這意味着這不是固定在即將到來的測試版。大約30分鐘後都停止播放音頻。

當AVPlayer.status == AVPlayerItemStatusFailed時,您可以註銷AVPlayer.status以獲取有關該錯誤的更多詳細信息。我收到:

Error Domain=AVFoundationErrorDomain Code=-11819 "Cannot Complete Action" UserInfo=0x178a75bc0 {NSLocalizedDescription=Cannot Complete Action, NSLocalizedRecoverySuggestion=Try again later.}

試圖抓住這一點,並停止和開始我的球員,即使我再收到一個致命的錯誤,告訴我,AVPlayer已釋放。在這一點上,可能值得嘗試按照Hendrik的建議重新初始化一個新的AVPlayer實例。這仍然不能解決您嘗試重新初始化時音頻臨時切斷的事實。您的AVPlayer也可能會收到通知,然後才能重新初始化它,這意味着您將收到致命錯誤;這遠非永久性修復。

也許其他人會有更多的運氣,可以提供更具體的修復。同時,我也向Apple報告了這個錯誤。

更新2014年10月15日:蘋果已經關閉了我的錯誤報告以及此狀態:重複18152675(已關閉)。

4

看起來是固定的iOS 8.1

+0

是的,我在問題中運行了示例代碼,並且流式傳輸持續了30分鐘(之後我手動停止了它)。我想知道爲什麼這個iOS 8.0的bug不會影響潘多拉和Spotify。 – RawMean 2014-10-21 01:23:35

0

這個問題似乎已經固定iOS8.1更新。我昨天更新了它,並能夠流45分鐘,而在更新之前,它將在10-15分鐘內崩潰。