2011-01-28 71 views
5

用於iphone語音變化的應用(目標c)中,我試圖從記錄音頻隊列緩衝器採取取樣的整數值,它們的過程中的功能和寫修改後的值返回到回放緩衝器。 目前我使用這樣的事情如何從音頻隊列緩衝區中提取整數採樣並將修改後的採樣寫回?

AudioBuffer audioBuffer = bufferList->mBuffers[0]; 
int bufferSize = audioBuffer.mDataByteSize/sizeof(SInt32); 
SInt32 *frame = audioBuffer.mData; 
SInt32 signalInput[22050]; 
for(int i=0; i<bufferSize; i++) { 
    SInt32 currentSample = frame[i]; 
    *(signalInput +i) = currentSample; 
} 

提取採樣數據,似乎工作得很好(signalinput應該是寫整數樣本目標向量)。 但它們寫回緩存仍然是一個問題...... 我搜索論壇的文檔和大量的找到一個解決方案,但沒有成功呢。

如果你想修改實時音頻您可能需要使用RemoteIO音頻單元,而不是嘗試這樣的id是非常感激的任何建議, 在此先感謝,盧卡斯

回答

4

當使用音頻隊列,你必須從記錄隊列回調保存數據,後來在不同的時間處理數據饋送到播放隊列回調,在回調不同。爲此,您可能必須使用中間隊列或數據緩衝區。爲了達到這個目的,它可能有助於嘗試讓錄音聲音應用程序運行,然後運行示例播放應用程序,然後將兩者結合起來。

補充:

這裏有一些源代碼示例寫作樣本值的到音頻輸出隊列:

http://lists.apple.com/archives/coreaudio-api/2008/Dec/msg00173.html https://bitbucket.org/ddribin/a440/wiki/Home

只需使用自己的前處理的樣品,而不是正弦波。

+0

感謝您的快速響應。 - 錄音部分已經在工作。例如,我想改變回調以修改記錄的樣本,然後將它們寫入文件。不管怎樣,是否有可能,如果是這樣,我如何直接訪問音頻緩衝區的記錄樣本(不管是音頻隊列還是音頻單元)。 – Lukas 2011-01-28 20:12:44