2012-02-22 31 views
0

我在AVPlayer中遇到問題,而不是在後臺播放AVPlayer沒有在後臺轉發流媒體軌道

下面是詳細信息:

我有一個AVPlayer對象和AVPlayerItem爲我的視圖控制器的一個實例變量流從存儲在NSMutableArray裏鏈接的音樂,linkArray。當用戶在一個UITableView點擊一個軌道的軌道,這兩個對象實例化,像這樣:

musicPlayerItem = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:[linkArray objectAtIndex:indexPath.row]]]; 
player = [[AVPlayer alloc] initWithPlayerItem:musicPlayerItem]; 

...而它起着非常完美。每當曲目完成而應用程序是活動它會跳過罰款,或者當我手動觸發應用程序跳過曲目(無論是活動或後臺)。但是,當應用程序在後臺(包括設備被鎖定時)時,它不會在跳過時播放下一首曲目。

因此,它自己跳到下一首曲目,但不播放它。我必須再次使應用程序處於活動狀態或調用播放(通過耳機控制或全系統音樂控制)。

下面是skipTrack方法的代碼被稱爲兩個手動調用或系統時,這首歌的時候到達軌道末端:

 if (nowPlaying == [linkArray count]-1) { 
      nowPlaying = 0; 
      musicPlayerItem = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:[linkArray objectAtIndex:0]]]; 
      player = [[AVPlayer alloc] initWithPlayerItem:musicPlayerItem]; 
     } else { 
      NSLog(@"NowPlaying (before increment: %i", nowPlaying); 
      //If not, increment nowPlaying by one and play 
      nowPlaying++; 
      NSLog(@"NowPlaying (after increment: %i", nowPlaying); 
      musicPlayerItem = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:[linkArray objectAtIndex:nowPlaying]]]; 
      player = [[AVPlayer alloc] initWithPlayerItem:musicPlayerItem]; 
    } 

真希望有人能幫助我與

回答

2

所以問題是,因爲你已經啓用了你的應用在後臺播放音頻,它將在音樂播放時保持活動狀態。一旦音樂停止,它將被暫停。因此,只要歌曲停止(大多數播放器具有歌曲完成時的回調函數,將此代碼放在開頭處),您就需要時間在後臺執行中的任務。所以,你的代碼會是這個樣子......

UIBackgroundTaskIdentifier newTaskID = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
    // Clean up any unfinished task business by marking where you. 
    // stopped or ending the task outright. 
    [application endBackgroundTask:newTaskID]; 
    newTaskID = UIBackgroundTaskInvalid; 
}];]; 

if (nowPlaying == [linkArray count]-1) { 
     nowPlaying = 0; 
     musicPlayerItem = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:[linkArray objectAtIndex:0]]]; 
     player = [[AVPlayer alloc] initWithPlayerItem:musicPlayerItem]; 
    } else { 
     NSLog(@"NowPlaying (before increment: %i", nowPlaying); 
     //If not, increment nowPlaying by one and play 
     nowPlaying++; 
     NSLog(@"NowPlaying (after increment: %i", nowPlaying); 
     musicPlayerItem = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:[linkArray objectAtIndex:nowPlaying]]]; 
     player = [[AVPlayer alloc] initWithPlayerItem:musicPlayerItem]; 
} 

[[UIApplication sharedApplication] endBackgroundTask:newTaskID]; 
newTaskID = UIBackgroundTaskInvalid;' 

的「beginBackgroundTaskWithExpirationHandler:」方法將給予你一些時間做的事情,而在後臺。如果你的時間用完了,發送給該方法的代碼塊將被執行。你需要包括一些事情出錯,你需要清理任務。閱讀更多關於它在開發庫:here

+0

感謝您的答覆。 n00b問題,但是,什麼數據類型是_newTaskID_?我閱讀了你所附的iOS編程指南,其描述有點令人困惑。謝謝 – 2012-02-23 21:51:04

+0

哎呀,我應該包括,這是一個UIBackgroundTaskIdentifier。所以,只需將其聲明爲「UIBackgroundTaskIdentifier newTaskID」 – Build 2012-02-23 22:05:01

+0

好的,做到了。我在視圖控制器中的_applicationDidEnterBackground:_方法中調用了這個方法?再次感謝。 – 2012-02-23 22:06:57