我正在为 iPhone 设计一个音乐可视化应用程序。
我想通过 iPhone 的麦克风采集数据,对其运行傅里叶变换,然后创建可视化来实现这一点。
我能得到的最好的例子是奥里奥图奇 http://developer.apple.com/library/ios/#samplecode/aurioTouch/Introduction/Intro.html它根据 FFT 数据生成完美的图表。然而,我一直在努力在自己的项目中理解/复制 aurioTouch。
我无法理解 aurioTouch 在执行 FFT 之前到底从麦克风中获取数据的位置?
还有其他代码示例可以用来在我的项目中执行此操作吗?或者还有其他提示吗?
由于我计划自己使用麦克风的输入,因此我认为您的问题是熟悉相关示例代码的好机会。
我回溯一下阅读代码的步骤:
- 开始于
SpectrumAnalysis.cpp
(因为很明显音频必须以某种方式到达这个类),你可以看到类方法SpectrumAnalysisProcess
有第二个输入参数const int32_t* inTimeSig
--- 听起来是一个很有希望的起点,因为输入时间信号正是我们正在寻找的。
- 使用右键菜单项
Find in project
在这个方法上,你可以看到,除了明显的定义和声明之外,这个方法只在FFTBufferManager::ComputeFFT
方法,它从哪里得到mAudioBuffer
作为它的第二个参数(inTimeSig
从步骤 1) 开始。寻找此类数据成员会给出超过 2 或 3 个结果,但其中大多数又只是定义/内存分配等。有趣的搜索结果是mAudioBuffer
用作参数memcopy
,在方法内部FFTBufferManager::GrabAudioData
.
- 再次使用搜索选项,我们看到
FFTBufferManager::GrabAudioData
仅在名为的方法内调用一次PerformThru
。该方法有一个名为的输入参数ioData
(听起来很有希望)类型AudioBufferList
.
- 寻找
PerformThru
,我们看到它用在下面一行中:inputProc.inputProc = PerformThru;
- 我们快到了:: 看起来像是注册一个回调函数。寻找类型inputProc
,我们确实看到它是AURenderCallbackStruct
- 就是这样。回调由音频框架调用,音频框架负责向其提供样本。
您可能需要阅读以下文档AURenderCallbackStruct
(或者更好的是,音频单元托管 http://developer.apple.com/library/ios/#documentation/MusicAudio/Conceptual/AudioUnitHostingGuide_iOS/Introduction/Introduction.html)以获得更深入的理解,但我希望这给您一个良好的起点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)