【问题标题】:Core Audio AudioBuffer mDataCore Audio AudioBuffer mData
【发布时间】:2011-11-10 03:55:05
【问题描述】:

我正在尝试学习如何在 iOS 上处理音频,并且我在 Apple 的开发人员页面上阅读了很多内容。但是,我已经到了拥有 AudioBuffer 的地步,但我不确定如何处理它。我知道它包含一个 mData 缓冲区,但我不知道它包含什么。正如参考文献所描述的那样,我四处寻找什么是“音频数据缓冲区”,但我似乎仍然不明白那是什么。

此外,我收集的 mData 似乎是 void 类型,它可能被转换为包含的特定音频的类型。我想我也不确定如何知道将其转换为什么。

【问题讨论】:

    标签: ios objective-c core-audio


    【解决方案1】:

    你不需要投射它。它是(无效*)的良好。它包含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];
        }
    }
    

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

    【讨论】:

    • 实际上,audiobufferlist中包含的数据类型取决于您正在使用的音频格式(audiostreamBasicDescription) - 如果您当前使用8.24,它只有8.24。它可能是sint16,它可以是sint24,或浮动,例如浮动。 span>
    • 好的。什么是“mybuffer”?! span>
    【解决方案2】:

    如果您认真学习 Core Audio,请帮自己一个忙,买这本书。它让我开始了,Core Audio 绝非易事! http://www.amazon.com/Learning-Core-Audio-Hands-Programming/dp/0321636848

    码头。

    【讨论】:

      【解决方案3】:
      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
      

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

      【讨论】:

        【解决方案4】:

        这是一个快速简单的示例application,它在我的 Github 上使用了 AudioBuffer。如果您稍微尝试一下,您就会了解如何使用 AudioBuffer..(另请参阅 discussion)。

        【讨论】:

          猜你喜欢
          • 2011-05-17
          • 1970-01-01
          • 2015-03-01
          • 2014-05-07
          • 1970-01-01
          • 2017-09-25
          • 1970-01-01
          • 1970-01-01
          • 2014-05-29
          相关资源
          最近更新 更多