在 iOS 和 Mac OS X 上使用 Audio Units 进行快速音频处理很困难,并且会留下伤痕和血迹。以前需要几天才能完成的事情,现在只需几行代码即可完成。
Novocaine *audioManager = [Novocaine audioManager];
[audioManager setInputBlock:^(float *newAudio, UInt32 numSamples, UInt32 numChannels) {
// Now you're getting audio from the microphone every 20 milliseconds or so. How's that for easy?
// Audio comes in interleaved, so,
// if numChannels = 2, newAudio[0] is channel 1, newAudio[1] is channel 2, newAudio[2] is channel 1, etc.
}];
Novocaine *audioManager = [Novocaine audioManager];
[audioManager setOutputBlock:^(float *audioToPlay, UInt32 numSamples, UInt32 numChannels) {
// All you have to do is put your audio into "audioToPlay".
}];
是的。Novocaine 是 Octave、Fourier 和 oScope 音频分析应用套件音频引擎三年工作的成果。
RingBuffer 类是用 C++ 编写的,使其运行更加迅速,因此使用它的类将需要是 Objective-C++。将所有使用 RingBuffer 的 MyClass.m 文件更改为 MyClass.mm。
在 ViewController.mm 中有许多我编写的小示例。取消注释一个并听听它的声音。
请注意,对于涉及直播的示例,您应该使用耳机。麦克风和扬声器的距离过近会产生一些难听的反馈。
如果您想深入了解 Core Audio,可以点击这里:http://www.subfurther.com/blog/2009/04/28/an-iphone-core-audio-brain-dump/、http://atastypixel.com/blog/using-remoteio-audio-unit/。
如果您想要深入了解,想要勇敢地靠近硬件,我可以指向我学习如何进行这些操作的地方。Chris Adamson 和 Michael Tyson 都是 iOS 音频领域的大人物,他们都写了不可或缺的博客文章(Chris 的,Michael 的)。另外,Chris Adamson 现在有一本关于 Core Audio 的整本书。我一定会为了获得这本书而做些无法言说的牺牲。