我是 iOS 编程新手,我想使用 Swift 3 将 Android 应用程序移植到 iOS。该应用程序的核心功能是从麦克风读取字节流并实时处理该流。因此,将音频流存储到文件并在录音停止后对其进行处理是不够的。
我已经找到了可以工作的 AVAudioRecorder 类,但我不知道如何实时处理数据流(过滤、将其发送到服务器等)。 AVAudioRecorder 的 init 函数如下所示:
AVAudioRecorder(url: filename, settings: settings)
我需要一个类,我可以在其中注册一个事件处理程序或类似的东西,每次读取 x 个字节时都会调用该类,以便我可以处理它。
这可以用 AVAudioRecorder 实现吗?如果没有,Swift 库中是否还有另一个类可以让我实时处理音频流?在 Android 中我使用 android.media.AudioRecord 所以如果 Swift 中有一个等效的类那就太好了。
问候
使用Core Audio框架中的Audio Queue服务。 https://developer.apple.com/library/content/documentation/MusicAudio/Conceptual/AudioQueueProgrammingGuide/AQRecord/RecordingAudio.html#//apple_ref/doc/uid/TP40005343-CH4-SW1
static const int kNumberBuffers = 3; // 1
struct AQRecorderState {
AudioStreamBasicDescription mDataFormat; // 2
AudioQueueRef mQueue; // 3
AudioQueueBufferRef mBuffers[kNumberBuffers]; // 4
AudioFileID mAudioFile; // 5
UInt32 bufferByteSize; // 6
SInt64 mCurrentPacket; // 7
bool mIsRunning; // 8
};
以下是该结构中字段的描述:
1 设置要使用的音频队列缓冲区的数量。 2 AudioStreamBasicDescription 结构(来自 CoreAudioTypes.h) 表示写入磁盘的音频数据格式。这种格式得到 由 mQueue 字段中指定的音频队列使用。 mDataFormat 字段最初由程序中的代码填充,如中所述 设置录音的音频格式。这是一个很好的做法 通过查询音频队列来更新该字段的值 kAudioQueueProperty_StreamDescription 属性,如中所述 从音频队列获取完整的音频格式。在 Mac OS X v10.5 上, 请改用 kAudioConverterCurrentInputStreamDescription 属性。
有关AudioStreamBasicDescription结构的详细信息,请参见Core 音频数据类型参考。
3 您的应用程序创建的录音音频队列。
4 一个数组,保存指向音频队列缓冲区的指针,该缓冲区由 音频队列。
5 一个音频文件对象,代表您的程序所放入的文件 记录音频数据。
6 每个音频队列缓冲区的大小(以字节为单位)。这个值是 在这些示例中,在 DeriveBufferSize 函数中计算后 音频队列已创建且在启动之前。请参阅写一个 导出录音音频队列缓冲区大小的函数。
7 从当前写入的第一个数据包的数据包索引 音频队列缓冲区。
8 一个布尔值,指示音频队列是否在 跑步。