2
我在AudioBuffer中有某些數據(來自錄音)。在我將這個緩衝區寫入文件之前,我想對PCM樣本做些什麼。我如何從AudioBuffer的mData字段中讀取,就像我可以使用fread讀取的一樣? 我可以在.mm或.m文件中使用fread嗎?如何從iOS中的AudioBuffer的mData字段讀取數據?
我在AudioBuffer中有某些數據(來自錄音)。在我將這個緩衝區寫入文件之前,我想對PCM樣本做些什麼。我如何從AudioBuffer的mData字段中讀取,就像我可以使用fread讀取的一樣? 我可以在.mm或.m文件中使用fread嗎?如何從iOS中的AudioBuffer的mData字段讀取數據?
AudioBuffer
結構將其數據保存在內存中,而不是保存在文件中。因此fread
不相關。 mBuffer
只是一個指向數據開始的指針,您可以使用結構的其他兩個字段來正確讀取數據。從this link:
struct AudioBuffer {
UInt32 mNumberChannels;
UInt32 mDataByteSize;
void *mData;
};
mDataByteSize
告訴你有多少字節的緩衝區保存(這樣你就不會訪問內存通過緩衝區的末尾),以及mNumberChannels
告訴您如何重新整理你的數據,例如如果緩衝區包含兩個通道,則數據是交錯的,即樣本1,3,5,...來自通道1,而2,4,6,...來自通道2.
請注意您還負責將數據轉換爲正確的類型。
是的,這是正確的。 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
如果您只是通過'AudioQueueBufferRef inBuffer'聲明一個緩衝區那麼沒有人用樣品填充它;你不能指望樣品來自任何地方。例如,您可以爲緩衝區分配內存,然後將其發送到'AudioUnitRender'以填充來自硬件的樣本。 – 2011-03-22 14:35:12
樣本已經填充到緩衝區中。我提到,只是爲了傳達inBuffer的數據類型:)對於混淆抱歉。 – Namratha 2011-03-23 06:43:37