2012-08-13 88 views
2

因此,我正在構建一個小型應用程序,該應用程序具有一個鍵盤和一些其他觸發音頻樣本的按鈕。iOS音樂應用程序的音頻框架

對於這種應用,有幾個預先錄製的音軌(鼓,主唱,吉他手)可靜音/取消靜音...我有這部分工作的罰款與AVAudioPlayer

但是,因爲大多數人都知道,AVAudioPlayer有點慢,如果它被指定觸發一個鼓聲或合成器的小型音頻採樣,則會有一些延遲。所以我實現了SystemSoundServices來播放短小的聲音樣本。只要按下按鈕和聲音播放之間的延遲,它工作的很好,但我有一個小問題。當樣本說,重複兩次,你會聽到一個小的爆裂聲,這是預料之中,因爲它第二次擊中按鈕時切斷播放的第一個樣本。

我想通過基本檢測樣本是否正在播放,如果是,然後將音量設置爲0,停止播放,然後再次播放樣本來解決此問題。但不幸的是systemsoundservices沒有內置這個功能。AVAudioPlayer不過它太慢了。我知道有CoreAudio,AudioQueue,Open AL,但這些都顯得複雜,我需要做的事情。我不需要做任何類型的音頻處理。

有沒有人有任何建議的音頻框架,不需要寫100行代碼只是爲了播放短的音頻剪輯?事情似乎是指着我花了幾周的時間學習CoreAudio/AudioQueue/OpenAL,這看起來像是在浪費我的工作時間。

回答

1

您可以使用AUSampler作爲採樣器。授予,它比SystemSounds更復雜。 AUSampler是系統提供的AudioUnit。所以你將有一個小的程序化AU配置來做,但難以實現的東西。

您可以使用AudioFileExtAudioFile來讀取和創建音頻文件。在AUSampler的情況下,它知道如何加載樣本(在可用格式的子集中),所以您甚至不需要寫入文件I/O部分。

對於更復雜的音頻,您可能需要親自處理音頻流。

+1

謝謝你,這正是我正在尋找... – rbertsch8 2012-08-13 19:19:45

+0

@ rbertsch8不客氣。 – justin 2012-08-13 19:21:47

0

你沒有提及你的音軌是否被壓縮,但如果它們很短,你可能會嘗試使用.wav或其他未壓縮的格式。 AVAudioPlayer不必花時間開始解壓縮它們。它仍然有一個短暫的延遲,但沒有MP3那麼長。

除此之外,我認爲壓低和學習一個較低級別的框架將是你需要做的。

這裏是一個很好的方便介紹到OpenAL的,如果你喜歡的是: http://benbritten.com/2008/11/06/openal-sound-on-the-iphone/

編輯:此外 - 您使用的prepareToPlay方法調用調用play之前,是否正確?

+0

感謝您的回覆。是的,我正在使用AVAudio的prepareToPlay。所有樣本都採用.aif格式,但如有必要,我們可以更改。我認爲AUSampler的justins解決方案將適用於我的案例,但如果沒有,我會咬緊牙關學習OpenAL。 – rbertsch8 2012-08-13 19:28:08

+0

.aif沒有真正壓縮,所以你已經做了我會建議的一切。 – 2012-08-13 20:51:17

0

我的解決方案如下。我創建了三個具有相同URL的Avaudio Player。 當我即將開始聲音時,我使用屬性isPlaying來確定要播放哪個Avaudio。 聲音用方法performSelector:WithObject:AfterDelay淡出。當聲音消失時,用戶可以再次彈奏鍵盤和第二個Avaudio,等等。

您需要的Avaudio數量取決於您淡出聲音的速度以及您希望用戶能夠播放的速度。

相關問題