我在理解的Core Audio,或者說工作讀取音頻:Extended Audio File Services有擴展音頻文件服務(ExtAudioFileRead)
在這裏,我想用ExtAudioFileRead()
從文件中讀取一些音頻數據。
這隻要罰款,因爲我用一個單一的巨大緩衝器來存儲我的音頻數據(即一個AudioBuffer
)的作品。當我使用一個以上的AudioBuffer
,ExtAudioFileRead()
返回錯誤代碼-50
(「參數列表錯誤」)。據我所知,這意味着ExtAudioFileRead()
的一個論點是錯誤的。可能是audioBufferList
。
我不能使用一個巨大的緩衝區,因爲那樣,dataByteSize
會溢出它的UInt32
整數範圍與巨大的文件。
下面是創建audioBufferList
代碼:
AudioBufferList *audioBufferList;
audioBufferList = malloc(sizeof(AudioBufferList) + (numBuffers-1)*sizeof(AudioBuffer));
audioBufferList->mNumberBuffers = numBuffers;
for (int bufferIdx = 0; bufferIdx<numBuffers; bufferIdx++) {
audioBufferList->mBuffers[bufferIdx].mNumberChannels = numChannels;
audioBufferList->mBuffers[bufferIdx].mDataByteSize = dataByteSize;
audioBufferList->mBuffers[bufferIdx].mData = malloc(dataByteSize);
}
這裏是工作,但溢出代碼:
UInt32 dataByteSize = fileLengthInFrames * bytesPerFrame; // this will overflow
AudioBufferList *audioBufferList = malloc(sizeof(audioBufferList));
audioBufferList->mNumberBuffers = 1;
audioBufferList->mBuffers[0].mNumberChannels = numChannels;
audioBufferList->mBuffers[0].mDataByteSize = dataByteSize;
audioBufferList->mBuffers[0].mData = malloc(dataByteSize);
最後的ExtAudioFileRead()
(電話應於這兩種版本):
UInt32 numFrames = fileLengthInFrames;
error = ExtAudioFileRead(extAudioFileRef,
&numFrames,
audioBufferList);
你知道我在做什麼錯她嗎è?
那麼,是否有'mNumberBuffers'不是1的情況? – bastibe 2010-03-27 15:01:07
我不確定這個參數是否正確,因爲在aurioTouch2示例中,mNumberBuffers設置爲2,我想知道是否有人知道原因。 – user454083 2013-08-31 21:40:49
順便說一句,如果我想同時要麼編碼或解碼緩衝區,我怎麼能在單獨的線程做這個工作 – user454083 2013-08-31 21:44:51