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

时间:2009-08-08 05:39:17

标签: iphone objective-c cocoa core-audio audioqueueservices

我试图通过AudioQueue读取音频数据。当我这样做时,我可以验证文件的位深度是16位。但是当我得到实际的样本数据时,我只看到-128到128的值。但我也看到了可疑的交错数据,这让我非常确定我只是没有正确读取数据。

首先,我可以验证源文件是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和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。看看它是如何增加的,而不是均匀的,但至少是顺利的?奇数行并不接近那么平滑。

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

我最好的猜测是我只是错误地读取数据,因此样本数据跨越两个返回。知道如何正确阅读它吗?

感谢您阅读整个问题,以及您可以提供的任何见解。

1 个答案:

答案 0 :(得分:8)

char *buffer= NULL;

这就是原因。您正在迭代有符号字节,而不是16位样本。

将变量声明为包含指向双字节值的指针:

SInt16 *buffer = NULL;

然后,迭代一半的样本作为字节:

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

我会将BUFFER_SIZE重命名为BUFFER_SIZE_BYTES以澄清它。