gpt4 book ai didi

iphone - AudioQueue 录制音频样本

转载 作者:行者123 更新时间:2023-11-28 17:32:24 25 4
gpt4 key购买 nike

我目前正在构建一个应用程序,该应用程序从我的 iPhone 的麦克风中读取音频,然后进行一些处理和视觉处理。当然,我首先从音频开始,但有一个小问题。

我将采样率定义为 44100 Hz,并将缓冲区定义为容纳 4096 个样本。哪个是。然而,当我打印出这些数据,将其复制到 MATLAB 中以再次检查准确性时,我必须使用的采样率是我 iPhone 定义的采样率的一半,即 22050 Hz,以确保它是正确的。

我认为它与以下代码有关,以及它如何为每个数据包放置 2 个字节,当我在缓冲区中循环时,缓冲区吐出整个数据包,我的代码假定它是一个数字.所以我想知道的是如何拆分这些数据包并将它们读取为单独的数字。

- (void)setupAudioFormat {
memset(&dataFormat, 0, sizeof(dataFormat));
dataFormat.mSampleRate = kSampleRate;
dataFormat.mFormatID = kAudioFormatLinearPCM;
dataFormat.mFramesPerPacket = 1;
dataFormat.mChannelsPerFrame = 1;
// dataFormat.mBytesPerFrame = 2;
// dataFormat.mBytesPerPacket = 2;
dataFormat.mBitsPerChannel = 16;
dataFormat.mReserved = 0;

dataFormat.mBytesPerPacket = dataFormat.mBytesPerFrame = (dataFormat.mBitsPerChannel / 8) * dataFormat.mChannelsPerFrame;
dataFormat.mFormatFlags =
kLinearPCMFormatFlagIsSignedInteger |
kLinearPCMFormatFlagIsPacked;
}

如果我描述的不清楚,请告诉我。谢谢!

编辑

添加我用来打印数据的代码

float *audioFloat =  (float *)malloc(numBytes * sizeof(float));
int *temp = (int*)inBuffer->mAudioData;
int i;
float power = pow(2, 31);
for (i = 0;i<numBytes;i++) {
audioFloat[i] = temp[i]/power;
printf("%f ",audioFloat[i]);
}

最佳答案

我发现我所做的有问题。这是一个 c 指针问题,因为我以前从未真正用 C 编程过,所以我当然弄错了。

您不能直接将 inBuffer->mAudioData 转换为 int 数组。所以我只是做了以下

SInt16 *buffer = malloc(sizeof(SInt16)*kBufferByteSize);
buffer = inBuffer->mAudioData;

结果很好,现在我的数据长度正确并且数据表示正确。

关于iphone - AudioQueue 录制音频样本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10874943/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com