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

Posted

技术标签:

【中文标题】使用 AudioQueue 读取音频缓冲区数据【英文标题】:Reading audio buffer data with AudioQueue 【发布时间】:2009-08-08 05:39:17 【问题描述】:

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

首先,我可以验证源文件是 44100、16 位、单声道 wav 文件。

我的缓冲区是这样分配的:

字符*缓冲区= NULL; 缓冲区 = malloc(BUFFER_SIZE); 断言(缓冲区);

所有相关值都设置和使用在:

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

作为测试,只是为了让我可以看到检索到的数据,我运行:

for(int i=0;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】:
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 以澄清它。

【讨论】:

以上是关于使用 AudioQueue 读取音频缓冲区数据的主要内容,如果未能解决你的问题,请参考以下文章

AudioQueue 如何从 CallBack 读取缓冲区

AudioQueue 录制音频样本

如何在 iOS 中使用原始数据播放音频?

使用 AudioQueue 播放断断续续的音频

iOS音频播放之AudioQueue:播放本地音乐

简单的 AudioQueue 正弦波——为啥会失真?