我想了解操縱iOS上的音頻,我一直在閱讀很多關於Apple的開發者頁面。不過,我已經達到了一個我有一個AudioBuffer的點,我不知道該怎麼做。我知道它包含一個mData緩衝區,但我不知道包含什麼。我已經查找了什麼是「音頻數據的緩衝區」,參考文獻描述了這一點,但我似乎仍然不明白這是什麼。核心音頻AudioBuffer mData
此外,mData似乎是void類型,我可以將其收錄爲特定音頻的類型。我想我不知道如何知道該怎麼把它當作是。
我想了解操縱iOS上的音頻,我一直在閱讀很多關於Apple的開發者頁面。不過,我已經達到了一個我有一個AudioBuffer的點,我不知道該怎麼做。我知道它包含一個mData緩衝區,但我不知道包含什麼。我已經查找了什麼是「音頻數據的緩衝區」,參考文獻描述了這一點,但我似乎仍然不明白這是什麼。核心音頻AudioBuffer mData
此外,mData似乎是void類型,我可以將其收錄爲特定音頻的類型。我想我不知道如何知道該怎麼把它當作是。
你不需要施放它。 (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];
}
}
這不一定是一個工作的代碼示例,我只是寫它從我的頭頂了。但它傳達了基本的想法。
如果您認真學習Core Audio,請幫助自己一個忙,並獲得本書。它讓我開始了,Core Audio一點都不容易! http://www.amazon.com/Learning-Core-Audio-Hands-Programming/dp/0321636848
碼頭。
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
的格式數據將取決於您的音頻配置。它可以被鑄造,但它也可以作爲無效,它將取決於你想要用它做什麼。
這是一個快速簡單的示例application,它在我的Github上使用了一個AudioBuffer。如果你稍微玩一下,你會知道如何處理AudioBuffer ..(另見discussion)。
實際上,AudioBufferLists中包含的數據類型取決於您正在使用的音頻格式(AudioStreamBasicDescription) - 如果您當前使用8.24,則只有8.24。例如,它可能是SInt16,可能是SInt24,或者是浮動的。 –
好的。什麼是「myBuffer」? –