2012-02-06 24 views
1

我正在使用FLAC-ALAC轉碼器,並嘗試使用ExtAudioFile寫入ALAC。我正在使用FLAC庫的基於回調的系統讀取FLAC文件,這意味着FLAC文件中的每個幀都會導致函數調用。在這一號召,我建立了我的緩衝區,並調用ExtAudioFileWrite代碼如下:ExtAudioFileWrite inNumberFrames參數的適當值是什麼?

AudioBufferList * fillBufList; 
fillBufList = malloc(sizeof *fillBufList + (frame->header.channels - 1) * sizeof fillBufList->mBuffers[0]); 
fillBufList->mNumberBuffers = frame->header.channels; 

for (int i = 0; i < fillBufList->mNumberBuffers; i++) { 
    fillBufList->mBuffers[i].mNumberChannels = 1; // non-interleaved 
    fillBufList->mBuffers[i].mDataByteSize = frame->header.blocksize * frame->header.bits_per_sample/8; 
    fillBufList->mBuffers[i].mData = (void *)(buffer[i]); 
    NSLog(@"%i", fillBufList->mBuffers[i].mDataByteSize); 
} 

OSStatus err = ExtAudioFileWrite (outFile, 1, fillBufList); 

現在,在最後一行的數字1是一個神奇的數字的東西,我已經選擇了,因爲我想,一個幀在FLAC文件中可能對應於相應ALAC文件中的一個幀,但似乎並非如此。每次調用ExtAudioFileWrite都會返回一個-50的錯誤值(用戶參數列表中的錯誤)。顯而易見的罪魁禍首是我爲框架參數提供的價值。

那麼我問,我應該提供什麼樣的價值?

還是我吠叫錯了樹? (注:我懷疑,儘管param相關的錯誤值,真正的問題可能是緩衝區設置,所以我試圖mallocing一個零化的虛擬緩衝區,看看會發生什麼,同樣的錯誤。)

+0

經過進一步的思考和研究,似乎術語「幀」可能意味着FLAC文檔和CoreAudio中的非常不同的東西。我已經嘗試提供每個通道的採樣數量(frame-> header.blocksize),但我仍然得到該參數錯誤。 – 2012-02-06 16:42:12

回答

2

對於ExtAudioFileWrite,幀數等於您要寫入的採樣數。如果你使用32位浮點交錯數據,它將是mDataByteSize /(sizeof(Float32)/ mNumberChannels)。它不應該是1,除非你只想寫一個樣本,如果你正在編寫一個壓縮格式,我認爲它需要一定數量的樣本。還有可能是-50錯誤是另一個問題。

要檢查的一件事是ExtAudioFile只需要一個緩衝區。所以你的fillBufList-> mNumberBuffers應該總是等於1,如果你需要做立體聲,你需要交錯音頻數據,這樣mBuffers [0] .mNumberChannels對於立體聲等於2。

+0

我相信你提出的最後一個問題正是這個問題。我需要在fillBufList中只使用一個緩衝區。但是這引出了一個子問題:當mNumberBuffers被認爲等於1時,爲什麼他們會使用「fillBufList」結構?爲什麼不只是讓ExtAudioFileWrite函數簡單地接受一個原始緩衝區? – 2012-02-10 21:22:54

+0

我不知道蘋果爲什麼這麼做,但我的經驗是,具有非交叉立體聲音頻數據(即mNumberBuffers爲2,並且有兩個帶音頻數據的mBuffers)從未工作過。只有交錯的音頻數據纔有效。他們可能希望能夠將API中其他位置的AudioBufferList結構用於多個緩衝區,但對於ExtAudioFile API,則不會這樣使用。 – lucius 2012-02-10 23:30:08

相關問題