2011-09-04 126 views
4

我想了解操縱iOS上的音頻,我一直在閱讀很多關於Apple的開發者頁面。不過,我已經達到了一個我有一個AudioBuffer的點,我不知道該怎麼做。我知道它包含一個mData緩衝區,但我不知道包含什麼。我已經查找了什麼是「音頻數據的緩衝區」,參考文獻描述了這一點,但我似乎仍然不明白這是什麼。核心音頻AudioBuffer mData

此外,mData似乎是void類型,我可以將其收錄爲特定音頻的類型。我想我不知道如何知道該怎麼把它當作是。

回答

3

你不需要施放它。 (void *)很好。它包含8.24位定點整數值的樣本。我知道這一開始可能令人望而生畏。 AudioBuffer的其他屬性描述是否有多個頻道。如果是這樣,它們是交錯的。

你可以用它做什麼,就是編寫一個呈現回調函數,如Audio Unit Hosting Guide所述,並開始將你緩衝區中的幀送入輸出,從而實現音頻回放。功能強大的是,您可以在將緩衝區數據發送到輸出之前對其進行處理,從而實現特殊效果,例如回放速率變化,音高偏移,延遲,回聲等等。

輸出在一個簡單的情況下渲染功能是這樣的:

OSStatus renderInput(void *inRefCon, 
    AudioUnitRenderActionFlags *ioActionFlags, 
    const AudioTimeStamp *inTimeStamp, 
    UInt32 inBusNumber, 
    UInt32 inNumberFrames, 
    AudioBufferList *ioData) 
{ 
    float *outA = (float*)ioData->mBuffers[0].mData; 
    float *outB = (float*)ioData->mBuffers[1].mData; 

    for (int i=0; i<inNumberFrames; i++) { 
     outA[i] = myBuffer.mData[i]; 
     outB[i] = myBuffer.mData[i]; 
    } 
} 

這不一定是一個工作的代碼示例,我只是寫它從我的頭頂了。但它傳達了基本的想法。

+5

實際上,AudioBufferLists中包含的數據類型取決於您正在使用的音頻格式(AudioStreamBasicDescription) - 如果您當前使用8.24,則只有8.24。例如,它可能是SInt16,可能是SInt24,或者是浮動的。 –

+0

好的。什麼是「myBuffer」? –

1
OSStatus callback(void *inRefCon,AudioUnitRenderActionFlags *ioActionFlags, 
const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, 
AudioBufferList *ioData); 

ioData包含您需要的數據。

你可以從那裏的緩衝區,即提取:

AudioBuffer buffer = ioData->mBuffer[index]; 

根據信道的數量,這將是mBuffers的數量。對於單聲道:

AudioBuffer buffer = ioData->mBuffer[0]; 

然後從緩衝區,可以提取 「真實」 的音頻數據:

buffer.mData 

和音頻所需的大小:

buffer.mDataByteSize 

的格式數據將取決於您的音頻配置。它可以被鑄造,但它也可以作爲無效,它將取決於你想要用它做什麼。

0

這是一個快速簡單的示例application,它在我的Github上使用了一個AudioBuffer。如果你稍微玩一下,你會知道如何處理AudioBuffer ..(另見discussion)。