访问 AVAudioSession 的音频缓冲区

Posted

技术标签:

【中文标题】访问 AVAudioSession 的音频缓冲区【英文标题】:Access audio buffer of an AVAudioSession 【发布时间】:2013-09-20 13:37:30 【问题描述】:

希望这个问题有点道理,我完全迷路了...... 在我的原型应用程序中,我正在记录微输入并保存它,到目前为止完全没有问题。

我现在需要在记录缓冲区时访问缓冲区,以便将数据块传递给另一个类(用 C 编写,而不是我编写的)来进行一些分析。

我花了一整天的时间浏览和阅读,看来我需要使用音频队列才能访问缓冲区。 问题是语法是C,我完全看不懂:)

所以我的问题是:

1) 还有其他方法可以实现我想要的吗?我不需要深入的解释,只是一些提示,我会浏览我的方式:) 我问是因为我不是 100% 确定音频队列是唯一的方法

2) 关于音频队列的任何好的教程或示例? aurioTouch tutorial by Apple 不是很有用(同样,我不知道 C)。通过遵循像我这样的菜鸟可以理解的好教程,我可以绕过我在 C 中的问题

非常感谢,感谢您提供的任何帮助。

【问题讨论】:

低级音频 API 和原始缓冲区格式都是基于 C 的,因此您最好了解一下 C 和 C 数据类型,因为 C 是正确且非常有用的子集目标 C,尤其适用于任何音频作品。 我对 Core Audio 一无所知,只知道 C,并且能够通过一些练习来构建和拆除音频图。如果您对 ios 或 OSX 上的音频非常认真,那么 [Chris A 的书][amazon] 是必不可少的。 [亚马逊]:amazon.com/Learning-Core-Audio-Hands-On-Programming/dp/… thx @nick 我还找到了那本书,并从网上阅读了一些示例/摘录,但同样,我的问题是我根本不喜欢 C。我可能会寻求帮助,因为这对我来说可能太硬核了:) 顺便问一下,你需要将数据传递给哪个类?它做了什么样的分析?只是好奇。 【参考方案1】:

好问题。 您可以使用其他人编写的代码,例如:

Novocaine - 非常简单。 (但有一些错误,至少在我 6 个月前使用的旧版本中。单声道和立体声的东西。)

Momu - 在 C++ 中相当不错(您需要为文件使用 .mm 扩展名)

如果您想要一些低级音频编程,这些将节省您的时间。不过,仍然需要一些 C 语言的基本技能。查看this guy。他的解释和热情非常好。

通过上述所有内容,您可以在 1-2 天的工作中做好准备,从而掌握 C 方面的良好技能。

编辑

基本上,在处理低级音频的任何地方,您都会处理称为音频样本的 C 数字数组(表示为 float *audioBuffer;)。你在一个循环中循环,做一些操作,复制它,发送到某个地方,分析。

要复制它,您必须为其分配空间。缓冲区的实际字节大小可以这样计算:numberOfSamples*sizeof(type)。

【讨论】:

我还推荐 iOS Accelerate.framework,尤其是它的 vDSP 部分,用于处理低级音频。在对音频缓冲区(向量)执行数学运算时使用它而不是循环 - 它工作得更快。 谢谢@krafter 我现在正在看 Novocaine。有什么好的文档或教程吗?从我在示例中阅读的代码来看,仍然不清楚如何访问传入缓冲区中的数据 "Getting Audio" 部分的 github 页面上,有从麦克风获取音频的代码。每隔几毫秒调用一次该块,将新的音频数据带入 float *newAudio 变量。

以上是关于访问 AVAudioSession 的音频缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

iOS 音频-AVAudioSession

AVAudioSession

使用 AVAudioSession 快速检测其他音频的属性

使用 AVAudioSession 时背景音频安静

AVAudioSession 学习笔记

iOS音频掌柜-- AVAudioSession