2011-04-06 29 views
4

我熟悉如何使用AudioUnit來播放聲音,並且被數據包和幀的概念所迷惑。我想知道:AudioUnit使用的數據包和幀大小有什麼值

  • 什麼是包的定義和AudioUnit的背景下架

  • 什麼是每幀

    使用每個包多個樣本的行業,和多個數據包

問我的理由:在我看到的所有代碼示例中,數據包本質上是一個樣本,對於16位立體聲流,通常mBytesPerPacket = 4。而mFramesPerPacket通常爲1,製作一個框架,一個數據包和一個樣本(全部是立體聲樣本),都是相同的概念。

我期待一個數據包和/或一個幀是樣本的緩衝區,即一組256或512個連續樣本,驅動程序可以被指向併線性讀取。將幀/數據包大小減少到一個樣本似乎會給任何驅動程序負責播放數據帶來不必要的壓力。我錯過了什麼?

回答

6

首先,一些定義:

  • 是音頻數據的單個樣品,其表示信號的用於在給定時間點的單個信道值。
  • A 數據包是一組幀,通常意味着在給定時間點所有通道的幀集合。
  • A 緩衝區是爲處理交付的一組幀。

你不應該混淆數據包和幀,事實上mFramesPerPacket通常應該設置爲1.這並不意味着你的AudioUnit的渲染方法將獲得每幀的回調。如果要控制發生次數,您需要將kAudioSessionProperty_PreferredHardwareIOBufferDuration屬性設置爲首選緩衝區大小。設置這個屬性並不能保證你所要求的確切的緩衝區大小,但是系統會嘗試給你一些接近這個值的東西。

+1

如果模擬器似乎沒有響應您請求的'kAudioSessionProperty_PreferredHardwareIOBufferDuration',請不要混淆,因爲根據我的經驗,此屬性僅影響設備。 – 2011-04-06 08:46:52

+0

@Itamar是的,偉大的一點。模擬器使用系統的CoreAudio配置,因此在幾個方面與iOS相比有很大不同,包括這一點。 – 2011-04-06 13:11:12

+0

謝謝。澄清和defs非常讚賞。 – double07 2011-04-06 16:31:42

相關問題