2009-08-08 64 views
6

我正在嘗試通過AudioQueue讀取音頻數據。當我這樣做時,我可以驗證文件的位深度是16位。但是當我得到實際的樣本數據時,我只能看到從-128到128的值。但是我也看到了可疑的交錯數據,這使我很確定我只是沒有正確讀取數據。使用AudioQueue讀取音頻緩衝區數據

所以首先,我可以驗證源文件是44100,16位單聲道wav文件。

我的緩衝區正是如此分配:

 
char *buffer= NULL; 
buffer = malloc(BUFFER_SIZE); 
assert(buffer); 

所有相關的值設置和使用:

 
AudioFileReadPackets(inAudioFile,false,&bytesRead,NULL,packetNum,&numPackets,buffer);  

作爲測試,只是讓我可以看到檢索到的數據,我跑:

 
for(int i=0;i<BUFFER_SIZE;i++){ 
    NSLog(@"%i", buffer[i]); 
} 

現在,我知道我的源文件在所有地方達到峯值,但是我所看到的值只在-128 nd 128.由於這是一個16位文件,因此我認爲這些值將是-32768到32768.

另外,數據中似乎有兩種模式。下面是一個返回數據的例子:

 
70 
-13 
31 
-11 
-118 
-9 
-15 
-7 
116 
-4 
31 
-1 
28 
1 
84 
2 
-123 
3 
-97 
4 
110 
5 
54 
6 
126 

現在看看從第二行開始的每一行:-13。看看它是如何增加的,而不是均勻的,但至少順利嗎?奇數行幾乎沒有光滑的地方。

我的第一個想法是,這是交錯立體聲數據,但不是,它只有一個通道,所以不應該有任何交錯,對嗎?

我最好的猜測是我只是錯誤地讀取數據,所以樣本數據跨越兩個回報。任何想法如何正確讀取它?

感謝您閱讀整個問題,併爲您提供任何見解。

回答

8
char *buffer= NULL; 

這就是原因。您正在迭代有符號的字節,而不是16位樣本。

變量聲明爲保持一個指針,兩個字節的值而不是:

SInt16 *buffer = NULL; 

接着,迭代一半多的樣本作爲字節:

for(int i=0;i < (BUFFER_SIZE/sizeof(*buffer));i++){ 
    NSLog(@"%i", buffer[i]); 
} 

我將重命名BUFFER_SIZEBUFFER_SIZE_BYTES到澄清它。

+0

再次感謝彼得! – 2009-08-08 06:53:46