Core Audio AudioBuffer mData

时间:2011-09-04 16:27:14

标签: ios objective-c core-audio

我正在尝试学习在iOS上操作音频,我在Apple的开发者页面上已经阅读了很多内容。但是,我已经达到了我有一个AudioBuffer的地步,我不知道该怎么做。我知道它包含一个mData缓冲区,但我不知道它包含什么。我已经四处查看了什么是“音频数据缓冲区”,正如参考文献所描述的那样,但我似乎仍然不明白它是什么。

此外,mData似乎是void类型,我收集的可能会被转换为包含的特定音频的类型。我想我不知道怎么知道把它当成什么。

4 个答案:

答案 0 :(得分:3)

你不需要施放它。它很好(void *)。它包含8.24bit定点整数值的样本。我知道一开始可能会让人望而生畏。 AudioBuffer的其他属性描述了是否有多个通道。如果是这样,它们是交错的。

使用它可以做的是编写一个渲染回调函数,如Audio Unit Hosting Guide中所述,并开始将缓冲区中的帧提供给输出,从而实现音频播放。功能强大的是,您可以在将缓冲区数据发送到输出之前对其进行操作,从而实现特殊效果,如播放速率变化,音高变换,延迟,回声等。

在简单的情况下,渲染函数中的输出是这样的:

 OSStatus renderInput(void *inRefCon,
    AudioUnitRenderActionFlags *ioActionFlags,
    const AudioTimeStamp *inTimeStamp,
    UInt32 inBusNumber,
    UInt32 inNumberFrames,
    AudioBufferList *ioData)
{
    float *outA = (float*)ioData->mBuffers[0].mData;
    float *outB = (float*)ioData->mBuffers[1].mData;

    for (int i=0; i<inNumberFrames; i++) {
       outA[i] = myBuffer.mData[i];
       outB[i] = myBuffer.mData[i];
    }
}

这不一定是一个有效的代码示例,我现在只是从头顶写下来。但它传达了基本思想。

答案 1 :(得分:1)

如果您对学习Core Audio非常认真,请帮个忙,然后阅读本书。它让我开始了,Core Audio一定不容易! http://www.amazon.com/Learning-Core-Audio-Hands-Programming/dp/0321636848

码头。

答案 2 :(得分:1)

OSStatus callback(void *inRefCon,AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames,
AudioBufferList *ioData);

ioData包含您需要的数据。

您可以从那里提取缓冲区,即:

AudioBuffer buffer = ioData->mBuffer[index];

根据通道数量,它将是mBuffers的数量。对于单声道:

AudioBuffer buffer = ioData->mBuffer[0];

然后从缓冲区中,您可以提取“真实”音频数据:

buffer.mData

所需音频的大小:

buffer.mDataByteSize

数据格式取决于您的音频配置。它可以被铸造,但它也可以作为无效,它将取决于你想用它做什么。

答案 3 :(得分:0)

这是一个快速简单的示例application,它在我的Github上使用AudioBuffer。如果你稍微玩一下,你就会知道如何处理AudioBuffer ..(另见discussion)。