Core Audio AudioBuffer mData

Mas*_*son 5 objective-c core-audio ios

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

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

rag*_*age 3

您不需要投射它。就如 (void *) 那样就好了。它包含 8.24 位定点整数值的样本。我知道一开始这可能会让人望而生畏。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];
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 实际上,AudioBufferLists 中包含的数据类型取决于您正在使用的音频格式 (AudioStreamBasicDescription) - 如果您当前使用 8.24,则只有 8.24。例如,它可以是 SInt16、SInt24 或浮点型。 (5认同)