使用AudioQueue读取音频缓冲区数据

问题描述:

我正在尝试通过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。看看它是如何增加的,而不是均匀的,但至少顺利吗?奇数行几乎没有光滑的地方。

我的第一个想法是,这是交错立体声数据,但不是,它只有一个通道,所以不应该有任何交错,对吗?

我最好的猜测是我只是错误地读取数据,所以样本数据跨越两个回报。任何想法如何正确读取它?

感谢您阅读整个问题,并为您提供任何见解。

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