2011-03-22 65 views
2

我在AudioBuffer中有某些數據(來自錄音)。在我將這個緩衝區寫入文件之前,我想對PCM樣本做些什麼。我如何從AudioBuffer的mData字段中讀取,就像我可以使用fread讀取的一樣? 我可以在.mm或.m文件中使用fread嗎?如何從iOS中的AudioBuffer的mData字段讀取數據?

回答

3

AudioBuffer結構將其數據保存在內存中,而不是保存在文件中。因此fread不相關。 mBuffer只是一個指向數據開始的指針,您可以使用結構的其他兩個字段來正確讀取數據。從this link

struct AudioBuffer { 
    UInt32 mNumberChannels; 
    UInt32 mDataByteSize; 
    void *mData; 
}; 

mDataByteSize告訴你有多少字節的緩衝區保存(這樣你就不會訪問內存通過緩衝區的末尾),以及mNumberChannels告訴您如何重新整理你的數據,例如如果緩衝區包含兩個通道,則數據是交錯的,即樣本1,3,5,...來自通道1,而2,4,6,...來自通道2.

請注意您還負責將數據轉換爲正確的類型。

+0

是的,這是正確的。 fread無法使用。我分配地址如下:AudBuf.mBuffers [0] .mData = inBuffer-> mAudioData;其中AudioBfferList AudBuf;和AudioQueueBufferRef inBuffer;是聲明。然後我做short int * ptr =(short int *)AudBuf.mBuffers [0] .mData;然後我做* ptr訪問音頻樣本,然後用ptr ++來訪問後續的樣本,但在日誌中我可以看到* ptr的值始終爲0. – Namratha 2011-03-22 12:13:02

+0

如果您只是通過'AudioQueueBufferRef inBuffer'聲明一個緩衝區那麼沒有人用樣品填充它;你不能指望樣品來自任何地方。例如,您可以爲緩衝區分配內存,然後將其發送到'AudioUnitRender'以填充來自硬件的樣本。 – 2011-03-22 14:35:12

+0

樣本已經填充到緩衝區中。我提到,只是爲了傳達inBuffer的數據類型:)對於混淆抱歉。 – Namratha 2011-03-23 06:43:37

相關問題