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

标签 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。看看它是如何增加的,不是均匀的,但至少是平稳的?奇数行远没有那么平滑。

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

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

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

最佳答案

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 以阐明它。

关于iphone - 使用 AudioQueue 读取音频缓冲区数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1248060/

相关文章:

Cocoa:如何动态调整 NSTextField 的大小?

cocoa - 保存文件后文件监视器停止

c# - 如何在MonoDevelop中使用PickerView控件(iPhone)

ios - 具有不同高度的垂直对齐的 Collection View 单元格

ios - 为什么未建模的属性会引发故障?

ios - SiriKit INPayBillIntentHandling - Siri 说, "I wish I could, but <App> hasn' t 还没有和我一起设置。”

iphone - 当我调用 UIDocumentInteractionController 方法 "presentOpenInMenuFromRect: inView: animated:"时,iPad 应用程序崩溃

iPhone master detail app如何使用detail view更改master view中对应单元格显示的文本值

iphone - 是否可以使用phonegap为图像添加标题?

objective-c - 在 nsscrollview 上绘制 nsiamgeview 时位置错误?