2015-04-07 189 views
0

嘿,我有幾個AVAudioPlayers每個包含一個聲音。如果我多次按下相同的按鈕,它應該從頭開始重複聲音。如果之後再按下另一個按鈕,則應停止運行聲音以便爲新的「騰出空間」。iOS AVAudioPlayer再次播放聲音

的代碼我使用爲:

-(void) plays:(int)p{ // p is the index of the sound being triggered 

    if([players[p] isPlaying]) 
     {        // setting the time back to 0 makes 
     players[p].currentTime = 0.0; // the player automatically play again 
     } 
    else 
     { 
     [players[p] play]; // if not playing, start playing 
     } 

    if(last!=p) 
     {      // if the last sound is different from the current 
     [players[last] stop]; // stop the last one 
     players[last].currentTime = 0.0;} // put its position back to 0 

    last=p; // set the 'last' variable 

} 

然而,擊中同一個按鈕再次在沒有聽到聲音稍微延遲(也許20毫秒)結束。現在是時候了,AVAudioPlayer似乎需要「倒帶」曲目才能再次播放。一個解決這個問題的想法是爲每個聲音創建AVAudioPlayer的多個對象,但這會產生一些糟糕的代碼!關於如何使這個過程更快的任何想法?

謝謝,亞歷克斯

編輯:玩2種不同的聲音,工作完全正常,我不能在他們之間聽到任何延遲,因爲我prepareToPlay所有事先聲音。

回答

1

我知道如何消除20ms的差距,但首先考慮如果你想。

想象一下,如果您立即從聲音文件的中點跳到開頭,並且沒有任何間隙。更好的是,下載Audacity並聽聽它的聲音。由於不連續性,你會得到令人不快的crack or聲或流行音。或許那50秒的沉默實際上聽起來好於立即重新開始。

如果你想要一個不間斷的音頻流,你將不得不放棄簡單的AVAudioPlayer接口並構建一個AUGraph。當然,這意味着要學習複雜的音頻接口並學習所有關於音頻格式的知識。然後你必須弄清楚你要把什麼數據放到你的音頻流中。

你會如何讓你的循環聽起來不錯?你可能會試着在觸摸點淡出,然後消失。或者你可以在循環的開始和結尾搜索零交叉點(過零點就是聲波值爲0的地方)。它們發生了所有的時間在單聲道輸出,但可能很難找到你的輸出是否是立體聲。)最後,這聽起來會比20毫秒的靜音更好聽嗎?在進入學習AUGraph interace的漫長道路之前,先走出Audacity並嘗試循環。

+0

感謝您的詳細解答,我會爲此付出努力。看起來我需要把自己看成AUGraph的東西:/也要感謝所有與音樂有關的輸入,但我自己是一名製作人,我知道自己在做什麼,但不幸的是,我在製作音樂方面比在編碼方面做得更好哈哈 – user2875404

0

對於同一首歌曲,如何停止它,然後prepareToPlay和播放?

+0

這需要100ms,比我到目前爲止更差 – user2875404