AudioQueue录制音频样本

时间:2012-06-03 23:57:59

标签: iphone objective-c ios audiotoolbox audioqueue

我目前正在构建一个从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]);
}

2 个答案:

答案 0 :(得分:0)

我发现了我正在做的事情。这是一个c指针问题,因为我之前从未真正用C编程,我当然错了。

您无法直接将inBuffer-&gt; mAudioData转换为int数组。所以我简单地做了以下

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

这很好,现在我的数据长度正确,数据表示正确。

答案 1 :(得分:0)

我看到了你的答案,还有一个潜在的问题,它给出了错误的样本数据字节,这是因为交换字节的字节序问题。

- (void)feedSamplesToEngine:(UInt32)audioDataBytesCapacity audioData:(void *)audioData {     int sampleCount = audioDataBytesCapacity / sizeof(SAMPLE_TYPE);

SAMPLE_TYPE *samples = (SAMPLE_TYPE*)audioData;
//SAMPLE_TYPE *sample_le = (SAMPLE_TYPE *)malloc(sizeof(SAMPLE_TYPE)*sampleCount );//for swapping endians

std::string shorts;
double power = pow(2,10);
for(int i = 0; i < sampleCount; i++)
{
    SAMPLE_TYPE sample_le =  (0xff00 & (samples[i] << 8)) | (0x00ff & (samples[i] >> 8)) ; //Endianess issue
    char dataInterim[30];
    sprintf(dataInterim,"%f ", sample_le/power); // normalize it.
    shorts.append(dataInterim);
}