在我的應用程序中,我需要播放50 MB的音頻故事。如果在大約27分鐘的時間用戶點擊主頁按鈕,則聲音暫停。當他們恢復應用程序時,音頻將從停止的地方恢復。當用戶暫停我的應用程序時,我應該如何保存音頻文件的狀態?
我正在使用AVAudioPlayer播放此音頻,但我很擔心在應用程序轉到後臺時將這個大型音頻文件保存在內存中。對於像這樣的音頻文件,爲了最小化保存/恢復狀態的內存影響,您會推薦什麼?
在我的應用程序中,我需要播放50 MB的音頻故事。如果在大約27分鐘的時間用戶點擊主頁按鈕,則聲音暫停。當他們恢復應用程序時,音頻將從停止的地方恢復。當用戶暫停我的應用程序時,我應該如何保存音頻文件的狀態?
我正在使用AVAudioPlayer播放此音頻,但我很擔心在應用程序轉到後臺時將這個大型音頻文件保存在內存中。對於像這樣的音頻文件,爲了最小化保存/恢復狀態的內存影響,您會推薦什麼?
如果有必要,操作系統會殺死你的應用程序(並回收它的內存),所以我不會擔心蘋果因這些理由而拒絕它。
你應該使用的OpenAL:http://www.gamedev.net/reference/articles/article2008.asp
然後設置AL_SEC_OFFSET(秒偏移)的存儲位置,以開始在用戶離開。
我讀了很多關於OpenAl的內容,但我仍然是一名學生,我不能替代OpenAl我使用了兩種方法,並且發現AudioToolbox和AVFoundation框架比OpenAl更容易 – 2010-11-02 14:58:59
OpenAL對於這種情況極度矯枉過正。只需在退出時存儲回放位置,並使用AVAudioPlayer在返回時尋找回放位置將花費更少的時間來實現。 – 2010-11-02 17:32:53
我建議你堅持用AVAudioPlayer來做這樣大小的東西。你可以做的一件事是將處理放在你的應用程序委託中,以將你的音頻釋放到applicationDidReceiveMemoryWarning方法中。如果您的應用程序是後臺應用程序,並且需要更多堆內存,則操作系統將發送該調用,並且您可以優雅地處理該問題。
大概你只是在背景中讀取currentTime屬性,然後在你想要繼續你的應用時設置它。如果你這樣做,你可能會在中斷時釋放你的記憶,並在你醒來時嘗試重新創建你的播放器,但是當你得到內存警告時,我個人只會堅持釋放。
至於OpenAL,對於想要快速播放的短音很適用,但我建議您遠離它,不要超過幾秒鐘。
你好,currentTime是一個好主意,但有沒有一個特定的代碼來處理這個問題?另外在保存當前時間後做些什麼使AVAudioPlayer發佈?謝謝 – 2010-11-03 14:29:44
@ Bobi-C - currentTime只是一個屬性。閱讀它來收集當前的播放時間(可以保存到NSUserDefaults),並將其設置爲向前播放音頻文件中正確的位置。就音頻數據而言,只需將其釋放並刪除AVAudioPlayer上的數據屬性即可。這應該釋放音頻文件的內存,然後在應用程序再次激活時重新加載。這一切都應該是相當微不足道的實施。 – 2010-11-03 18:10:17
釋放已分配的內存時,只需確保正確處理內存管理(最簡單的檢查是使用「泄漏」工具運行應用程序以查看您的release/nil是否泄漏內存),但如果您使用autorelease池,則應該只要你沒有特別保留它或者做了其他的事情來增加那塊內存的觸摸計數,它就能夠按照規定釋放&nil。 – 2010-11-04 10:48:52
我不知道AVAudioplayer非常好,但是它能讓你尋找文件中的任何位置並開始播放嗎? – FrustratedWithFormsDesigner 2010-11-02 14:29:04