首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AudioQueue录音音频样本

AudioQueue录音音频样本
EN

Stack Overflow用户
提问于 2012-06-03 23:57:58
回答 2查看 1.3K关注 0票数 1

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

我将我的采样率定义为44100赫兹,并定义我的缓冲器可以容纳4096个样本。的确如此。然而,当我打印出这些数据时,将其复制到MATLAB中进行双重检查,我必须使用的采样率是我的iPhone定义率的一半,即22050赫兹,才能正确。

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

代码语言:javascript
复制
- (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;
}

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

编辑

添加用于打印数据的代码。

代码语言:javascript
复制
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]);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-05 01:52:02

我发现了我所做的事情的问题所在。这是一个c指针问题,因为我以前从来没有用C语言编写过程序,我当然搞错了。

不能直接将缓冲区->mAudioData转换为int数组。所以我所做的就是

代码语言:javascript
复制
SInt16 *buffer = malloc(sizeof(SInt16)*kBufferByteSize);
buffer = inBuffer->mAudioData;

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

票数 0
EN

Stack Overflow用户

发布于 2017-06-22 13:54:53

我看到了您的答案,还有一个潜在的问题,它给出了错误的示例数据字节,这是因为字节被交换的endian问题。

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

代码语言:javascript
复制
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10874943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档