2011-01-31 50 views
21

我正在爲iPhone開發一個交互式故事書類型應用程序,而且我最近遇到了關於設備上混音的令人沮喪的錯誤。MPMoviePlayerController和AVAudioPlayer音頻混合故障

首先,我設置了一個音頻會話。我將類別設置爲AVAudioSessionCategoryAmbient然後初始化並播放我的AVAudioPlayer實例。現在,在音頻播放的背景中,我預先加載了一個視頻,使用MPMoviePlayerController,然後致電prepareToPlay。我以這種方式預加載視頻的原因是因爲我需要在相當嚴格的時間後立即播放視頻。

在此配置中,音頻/電影可以正常工作,並且它們混合並且不會彼此中斷。但是,這種特殊的音頻會話類別不允許音頻在設備鎖定時繼續播放,這是我真正需要的功能。因此我不得不考慮一個不同的類別:AVAudioSessionCategoryPlayback

默認情況下,此類別不允許與其他音頻混合,according to the Apple docs。爲了能夠與其他音頻我重寫相關的類別混合:

OSStatus propertySetError = 0; 
UInt32 setProperty = 1; 
propertySetError = AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(setProperty), &setProperty); 
assert(propertySetError == 0); 

不幸的是,這解決了我的演奏,而鎖定的問題,而是引入了另一個問題:AVAudioPlayer音頻將暫時中斷的視頻負載有輕微口吃。口吃很小,可能不到一秒鐘,但足以破壞用戶體驗。我已閱讀this related post,這使我可以預先加載視頻,其中包括AVAudioSessionCategoryAmbient,但不幸的是,同樣的方法似乎不適用於新類別。

根據返回碼成功應用音頻會話類別。有誰知道爲什麼啓用混音與這個類別不同於環境類別提供的混音設備?

+0

歡迎來到StackOverflow。很好的問題! – Moshe 2011-01-31 18:05:28

回答

1

我發現處理類似問題的最佳方式是使用較新的AVPlayer(+1 @adam)並設置您的應用以啓用背景音頻並接收遙控器通知。我被@MarquelV告知了這一點:How can you play music from the iPod app while still receiving remote control events in your app?

如果你可以讓後臺工作正常工作,那應該可以讓你在設備被鎖定時繼續播放。哦,不要忘記添加鑰匙到info.plist,它很容易做,然後不知道爲什麼它不工作。