2010-03-15 83 views
4

我在理解的Core Audio,或者說工作讀取音頻:Extended Audio File Services有擴展音頻文件服務(ExtAudioFileRead)

在這裏,我想用ExtAudioFileRead()從文件中讀取一些音頻數據。
這隻要罰款,因爲我用一個單一的巨大緩衝器來存儲我的音頻數據(即一個AudioBuffer)的作品。當我使用一個以上的AudioBufferExtAudioFileRead()返回錯誤代碼-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); 

你知道我在做什麼錯她嗎è?

回答

5

我想你誤會了mNumberBuffers場的目的。單聲道和交錯立體聲數據通常爲1。您將其設置爲其他內容的唯一原因是多通道數據,其中每個通道位於單獨的數據緩衝區中。

如果要讀取文件的一部分,可以將緩衝區的dataByteSize設置爲合理的大小,並且當您讀取該文件時,請告訴API只給你那麼多字節,然後遍歷它。

+1

那麼,是否有'mNumberBuffers'不是1的情況? – bastibe 2010-03-27 15:01:07

+0

我不確定這個參數是否正確,因爲在aurioTouch2示例中,mNumberBuffers設置爲2,我想知道是否有人知道原因。 – user454083 2013-08-31 21:40:49

+0

順便說一句,如果我想同時要麼編碼或解碼緩衝區,我怎麼能在單獨的線程做這個工作 – user454083 2013-08-31 21:44:51

-3

可可只是似乎無法接受mNumberBuffers> 1,這是一種恥辱,因爲它使整個結構無用。 (我希望這是正確的...)

+0

這是不正確的。我相信mNumberBuffers> 1用於多聲道音頻。只要AudioBufferList結構的其餘部分必須有意義。 – notthetup 2012-09-17 08:11:54

1

我也有同樣的問題與mNumberBuffers> 1 ,, ... 我的工作圍繞參與創造我自己的內部緩衝:

類似:

字符緩衝器1 [byteSize] char buffer2 [byteSize]; ......

你也可以使用指針,使事情變得更容易,..喜歡:

緩衝[指數] [byteSize]

那麼你就必須通過手動進行迭代,並填滿他們的主線程,以避免在音頻故障。

ExtAudioFileRead只會在AudioBufferList填寫緩衝區[0],然後你可以有指向不同的手動分配的緩衝區作爲音頻播放。

希望這有助於。

+0

這不完全是我想要做的,但它肯定有幫助,如果你想填補幾個不同的緩衝區不同數據。 (我最初的想法是我可以用來自同一文件的連續數據塊填充多個緩衝區)。 – bastibe 2010-04-06 14:36:54

0

mNumberBuffers == 2當您處理非交叉立體聲時。這是未交錯時的音頻通道數量。