2017-03-12 100 views
1

我们的应用程序不断记录和处理来自iPhone麦克风的音频。实时音频处理Swift

目前我使用AVAudioRecorder和AVFoundation并将音频输入录制到8秒“.wav”文件中。我想连续将音频输入记录到缓冲区并处理8秒长的缓冲区块。

如何将音频输入记录到缓冲区以及如何从那里读取8秒长度的块?

谢谢!

+2

环形缓冲区可能是你要找的。 –

+0

感谢您的回答,您能举一些插入缓冲区代码的例子吗? –

+1

老实说,如果您想要实时处理音频,您可能希望使用比AVAudioRecorder更低的级别。 - > https://developer.apple.com/library/content/documentation/MusicAudio/Conceptual/AudioQueueProgrammingGuide/AQRecord/RecordingAudio.html#//apple_ref/doc/uid/TP40005343-CH4-SW1 –

回答

3

您可以通过多种方式接收原始PCM(在AV Foundation中:来自AVCaptureDevice的AVCaptureAudioDataOutput或插入了处理分接头的AVAudioEngine;在Audio Toolbox:Audio Queue Services中,RemoteIO音频单元),然后写入文件,您可以使用Audio Toolbox的AudioFile或ExtAudioFile,只需计算您已写入的帧数,并决定何时启动新的8秒文件。

正如艺术Fistman上面所指出的,这将是安全,如果你不喜欢的东西

捕捉回调--pushes到 - >环形缓冲区< --pulls-from--文件写入代码

因为当你关闭一个文件并打开另一个文件时,捕获回调仍然会进入,如果你阻止了文件I/O,你很有可能将一些数据放在地板上。

我想另一种方法是从回调中填充内存中的8秒缓冲区,当它完成时,让另一个线程写入该文件,同时你malloc一个新的缓冲区并开始记录到该文件中(显然,文件作者会在完成之后处置旧的缓冲区)。

编辑:另外,我没有看到任何关于Swift的问题,但是这些都可以在Swift或C/Obj-C中正常工作。