簡體   English   中英

在 iOS 上一次可以播放多少個聲音 - AVAudioPlayer vs. AVAudioEngine & AVAudioPlayerNode

[英]How many sounds can be played at a time on iOS - AVAudioPlayer vs. AVAudioEngine & AVAudioPlayerNode

我有一個應用程序,其中有一組大約 50 個聲音,長度范圍從大約 300 毫秒到大約 4 秒。 需要在精確的時間播放各種聲音組合(一次最多可以觸發 10 個)。 有些聲音需要以短至 100 毫秒的間隔重復。

我已經將其實現為 AVAudioPlayers 的二維數組,所有這些都在應用程序啟動時加載了聲音。 每個聲音有幾個播放器,以適應快速重復的聲音。 特定聲音的播放器在嚴格輪換中重復使用。 當安排新聲音時,該聲音的最舊播放器將停止,其當前時間設置為 0,因此聲音將從頭開始重復,下一次使用 player.play(atTime:) 安排。 有一個線程可以在播放新聲音之前大約 300 毫秒安排新的聲音集。

這一切都很好,直到某個點因設備而異。 最終,隨着聲音播放得更快,和/或安排了更多同時的聲音,一些聲音將拒絕播放。

我正在考慮使用混合器節點切換到 AVAudioEngine 和 AVAudioPlayerNodes。 有誰知道這種方法是否可以處理更多的同時聲音? 我的猜測是,這兩種方法都轉化為一組相當相似的 CoreAudio 函數,但我實際上並沒有編寫代碼來測試這個假設——在我這樣做之前,我希望其他人可能在我之前探索過這個問題。 我之前對CoreAudio很深入,我希望能夠使用這些方便的高級功能來代替!

另外,有沒有人知道當聲音開始時觸發關閉的方法? 記錄的功能允許回調關閉,但我能夠在聲音開始時觸發事件的唯一方法是為 DispatchQueue 創建高質量的服務隊列。 不幸的是,根據系統負載,排隊事件的執行時間可能與預定時間相差最多約 50 毫秒,這並不像我希望的那樣精確。

將 AVAudioEngine 與 AVAudioPlayersNodes 一起使用可以提供更好的性能,盡管代價是一些代碼復雜性。 通過更好的緩沖控制,我能夠輕松地將播放速率提高五倍。

切換到這種方法的主要缺點是 Apple 的文檔不夠出色。 在 Apple 的文檔中添加一些內容會使這項任務變得容易得多:

混音器節點被記錄為能夠轉換采樣率和通道數,因此我嘗試配置 audioEngine.mainMixerNode 以將 mono 緩沖區轉換為 output 節點的設置。 將主混音器節點的 output 設置為 output 節點的格式似乎是可以接受的,但在運行時拋出了不透明的錯誤,抱怨通道數不匹配。

看起來主混合器節點實際上並不是一個功能齊全的混合器節點。 為了讓它工作,我必須插入另一個執行通道轉換的混音器節點,並將其連接到主混音器節點。 如果 Apple 的文檔中確實提到了這一點,它會為我節省大量的實驗。

此外,僅調度緩沖區不會導致任何播放。 在發生任何事情之前,您需要在播放器節點上調用 play()。 Apple 的文檔在這里令人困惑 - 它說在沒有 arguments 的情況下調用 play() 將導致立即播放,這不是我想要的。 需要一些實驗來確定 play() 只是告訴播放器節點喚醒,並且預定的緩沖區實際上將在預定的時間播放,而不是立即播放。

如果 Apple 提供的不僅僅是自動生成的 class 文檔,那將會非常有幫助。 一些人工生成的文檔會為我節省大量令人沮喪的實驗。

當我使用 Core Audio 時,Chris Adamson 寫得很好的“Learning Core Audio”非常有幫助 - 遺憾的是,新的 AVAudioEngine 功能幾乎沒有被記錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM