2011-08-15 35 views
0

我想使用AVPlayer流式傳輸遠程mp3。iPhone AVPlayer - 在後臺執行代碼

我已經設置了音頻會話,並將後臺播放音頻添加到了我的info.plist文件中。

我運行這段代碼:

self.timeObserver = [self->player addPeriodicTimeObserverForInterval:CMTimeMake(1, 1) queue:nil usingBlock:^(CMTime time) { 
    [self updateControls]; 
}]; 

添加時間觀察,調用updateControls每一秒。

問題是,當聲音緩衝區很低時,播放器會暫停,並且在後臺停止該代碼,所以我必須再次手動按下應用程序中的播放。 (如果我暫停玩家,這段代碼也不會運行)

我做錯了什麼?我如何在不中斷的情況下在後臺運行一段代碼?

回答

0

你不能無限期地在後臺運行任意代碼。你可以保持音頻播放,但你不應該期望更新你的用戶界面,如果你不是最前面的應用程序。當您的應用移回前景時,您可以更新UI。

只要您正確設置AVAudioSession並使其處於活動狀態,並且設置了UIBackgroundModes,則應該可以繼續使用音頻。

看到http://developer.apple.com/library/iOS/#documentation/Audio/Conceptual/AudioSessionProgrammingGuide/Configuration/Configuration.html

0

您需要將信封你這樣的後臺代碼:

__block UIBackgroundTaskIdentifier bgTask = nil; 
    bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^(void) { 
     [[UIApplication sharedApplication] endBackgroundTask: bgTask]; 
     bgTask = UIBackgroundTaskInvalid; 
    }]; 

//Your bg code here 

[[UIApplication sharedApplication] endBackgroundTask: bgTask]; 
    bgTask = UIBackgroundTaskInvalid; 
+0

請問這樣跑,只要我AudioSession沒有被其他應用程序接管?或僅用於約。 10秒後又走了? – mzaouar

+0

它會運行相當長的時間,遠遠超過10秒。 – Akshay

+0

只要音頻正在播放,我需要它運行(30-40分鐘加..) self.timeObserver = [self> player addPeriodicTimeObserverForInterval:CMTimeMake(1,1)queue:nil usingBlock:^(CMTime time) {self_updateControls]; }]; 一旦播放暫停或互聯網連接滯後,此代碼停止運行,這是不好的! – mzaouar