術語「分組」指的是一組具有頭部的壓縮音頻樣本。您需要頭文件才能立即解碼數據。如果你認爲你的ima4文件是一本書,那麼每個數據包就是一個頁面。頂部是解碼該頁面所需的值,隨後是壓縮音頻。
這就是爲什麼您需要計算解壓縮數據的大小(然後爲其騰出空間) - 因爲它是壓縮的,所以您需要將數據從壓縮音頻轉換爲未壓縮音頻,然後才能輸出它。爲了分配一個輸出緩衝區,你需要知道它有多大(注意:你可能需要輸出比單個數據包大的數據塊)。
它看起來像前面的「概述」一節中的典型結構是64個樣本組,每個16位(如此128個字節)被轉換爲2個字節的標題和一組32個字節的壓縮樣本(總共34個字節)。因此,在典型情況下,您可以通過將輸入數據大小除以34得到數據包數量,然後將每個數據包的未壓縮音頻乘以128個字節,從而產生您期望的輸出數據大小。
不過你不應該那樣做。它看起來像你應該而不是查詢kAudioFilePropertyDataFormat獲得mBytesPerPacket - 這是上面的「34」值,和mFramesPerPacket - 這是上面的64,乘以2(對於16字節樣本),使128字節的輸出。
然後,對於每個數據包,您將需要運行在帖子中描述的解碼。在稍長的僞C代碼,假設你得到的字節陣列,處理頭:
packet = GetPacket();
Header = (packet[0] << 8) | packet[1]; //Big-endian 16-bit value
step_index = Header & 0x007f; //Lower seven bits
predictor = Header & 0xff80; //Upper nine bits
for (i = 2; i < mBytesPerPacket; i++)
{
nibble = packet[i] & 0x0f; //Low Nibble
process that nibble, per the blogpost -- be careful on sign-extension!
nibble = (packet[i] & 0xf0) >> 4; //High Nibble
process that nibble, per the blogpost -- be careful on sign-extension!
}
上面的符號擴展指的是交涉及處理在一個無符號和每個半字節兩者的事實簽名的方式。如果半字節(比特3)的高位是1,那麼它是負的;此外,移位可能會進行符號擴展。這不是在上面的僞代碼中處理的。
還告訴人們在你被卡住的東西。你最後確定了哪些步驟?你遇到過哪些問題? – Younes 2010-01-25 08:08:55
你必須使用OpenAL嗎?如果你使用的是OpenAL,你只需要自己解碼,否則你可以讓CoreAudio處理它。 – 2010-02-05 13:03:05