如何更改 aurioTouch 项目以将录音写入 .caff 或 .wav 文件

Posted

技术标签:

【中文标题】如何更改 aurioTouch 项目以将录音写入 .caff 或 .wav 文件【英文标题】:How to change aurioTouch project to write recordings to .caff or .wav file 【发布时间】:2012-07-17 08:09:51 【问题描述】:

我正在调查aurioTouch2 示例代码。

我想改变 smth 从麦克风录制音频并将这些数据写入 .caff 或 .wav 文件。所以以后我就可以用 AVAudioPlayer 播放这个音频了。

我的想法是在 applicationDidFinishLaunching 中使用 AVAudioRecorder,但可能不是最好的解决方案,或者甚至不可能通过这种方式(我没有尝试使用 AVAudioRecorder,因为我认为它很可能不是最好的主意)。 我尝试在

中写入字节数据
void FFTBufferManager::GrabAudioData(AudioBufferList *inBL)

     memcpy(mAudioBuffer+mAudioBufferCurrentIndex, inBL->mBuffers[0].mData, bytesToCopy);
     // after this I copy to my own buffer and collect all the data during 30 seconds

如您所见,我复制到自己的缓冲区并在 30 秒内收集所有数据。比我将数据写入 .caff 文件。这行不通。

更新:

或者可能存在播放音频二进制数据(未编码为.waf或.caff音频)的方式?

【问题讨论】:

【参考方案1】:

有几种不同的方法可以做到这一点。一种方法是使用ExtAudioFileWriteAsync。

Apple 提供了一个示例项目来演示如何执行此操作。我是RecordAudioToFile。

也可以看看其他一些帖子,例如Can anybody help me in recording iPhone output sound through Audio Unit

【讨论】:

关于“有几种不同的方法可以做到这一点。一种方法是使用 ExtAudioFileWriteAsync。”:要使用它,您应该使用 AudioBufferList。但是在这种情况下,您将遇到另一个问题:AudioBufferList 只有 0.1 秒的音频数据,问题是:如何结合此 AudioBufferList 来获取所有数据。 RecordAudioToFile 适用于 MacOS,不适用于 ios 是的,但它使用的 AudioToolbox API 和您将要使用的 API 可用于 iOS memcpy 每个 AudioBufferList 缓冲区的帧到不同的缓冲区,然后使用 err = ExtAudioFileWriteAsync(afr->fOutputAudioFile, inNumberFrames, afr->fAudioBuffer);【参考方案2】:

我不确定我是否正确理解了您,但您不能只将缓冲区写入磁盘。 CAF 和 WAV 文件需要它们自己的标题和音频数据的编码。 AVRecorder 类为您执行此操作。关于这个话题有很多问题。参见例如this question。

【讨论】:

我知道AVRecorder,但是aurioTouch使用的是低级编程,比如AudioUnit和AudioBufferList。我认为,这应该是使用这种低级工具来实现这一点的方法。 或者可能,有一种方法,我可以如何播放我写入二进制文件的数据集?

以上是关于如何更改 aurioTouch 项目以将录音写入 .caff 或 .wav 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 Google Compute Engine 服务帐户的范围以将数据写入 Google Cloud Storage 存储桶?

修改 Auriotouch 示例代码以从音频文件中读取数据

为啥我们在 aurioTouch 项目中只使用第一个缓冲区

将 Auriotouch 线性刻度更改为对数

AudioBufferList 的 AurioTouch 用途

AurioTouch2声音频率