Swift 3 中的 AVAudioRecorder:获取字节流而不是保存到文件

Sim*_*n H 7 microphone avaudiorecorder audio-processing ios swift

我是 iOS 编程新手,我想使用 Swift 3 将 Android 应用程序移植到 iOS。该应用程序的核心功能是从麦克风读取字节流并实时处理该流。因此,将音频流存储到文件并在录音停止后对其进行处理是不够的。

我已经找到了可以工作的 AVAudioRecorder 类,但我不知道如何实时处理数据流(过滤、将其发送到服务器等)。AVAudioRecorder 的 init 函数如下所示:

AVAudioRecorder(url: filename, settings: settings)
Run Code Online (Sandbox Code Playgroud)

我需要的是一个类,我可以在其中注册一个事件处理程序或类似的类,每次读取 x 个字节时都会调用该类,以便我可以处理它。

AVAudioRecorder 可以做到这一点吗?如果没有,Swift 库中是否还有另一个类可以让我实时处理音频流?在 Android 中我使用 android.media.AudioRecord 所以如果 Swift 中有一个等效的类那就太好了。

问候

raj*_*va9 2

使用 Core Audio 框架中的音频队列服务。\n https://developer.apple.com/library/content/documentation/MusicAudio/Conceptual/AudioQueueProgrammingGuide/AQRecord/RecordingAudio.html#//apple_ref/doc/uid/TP40005343-CH4 -SW1

\n\n
static const int kNumberBuffers = 3;                            // 1\nstruct AQRecorderState {\n    AudioStreamBasicDescription  mDataFormat;                   // 2\n    AudioQueueRef                mQueue;                        // 3\n    AudioQueueBufferRef          mBuffers[kNumberBuffers];      // 4\n    AudioFileID                  mAudioFile;                    // 5\n    UInt32                       bufferByteSize;                // 6\n    SInt64                       mCurrentPacket;                // 7\n    bool                         mIsRunning;                    // 8\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

这里\xe2\x80\x99是这个结构中字段的描述:

\n\n

1 设置要使用的音频队列缓冲区的数量。\n 2 AudioStreamBasicDescription 结构(来自 CoreAudioTypes.h)\n 表示要写入磁盘的音频数据格式。此格式由 mQueue 字段中指定的音频队列使用。mDataFormat\n 字段最初由程序中的代码填充,如\n 设置用于录制的音频格式中所述。最好通过查询音频队列的 kAudioQueueProperty_StreamDescription 属性来更新此字段的值,如从音频队列获取完整音频格式中所述。在 Mac OS X v10.5 上,\n 请改用 kAudioConverterCurrentInputStreamDescription 属性。

\n\n

有关 AudioStreamBasicDescription 结构的详细信息,请参阅 Core\n 音频数据类型参考。

\n\n

3 您的应用程序创建的录音音频队列。

\n\n

4 一个数组,保存指向由音频队列管理的音频队列缓冲区的指针。

\n\n

5 一个音频文件对象,表示程序在其中记录音频数据的文件。

\n\n

6 每个音频队列缓冲区的大小(以字节为单位)。在这些示例中,在创建音频队列之后和启动之前,在 DeriveBufferSize 函数中计算该值。请参阅编写\n 函数来导出录音音频队列缓冲区大小。

\n\n

7 要从当前音频队列缓冲区写入的第一个数据包的数据包索引。

\n\n

8 一个布尔值,指示音频队列是否正在运行。

\n
\n