我正在尝试学习在iOS上操作音频,我在Apple的开发者页面上已经阅读了很多内容。但是,我已经达到了我有一个AudioBuffer的地步,我不知道该怎么做。我知道它包含一个mData缓冲区,但我不知道它包含什么。我已经四处查看了什么是“音频数据缓冲区”,正如参考文献所描述的那样,但我似乎仍然不明白它是什么。
此外,mData似乎是void类型,我收集的可能会被转换为包含的特定音频的类型。我想我不知道怎么知道把它当成什么。
答案 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)。