我是iOS编程的新手,我想使用Swift 3将Android应用程序移植到iOS。该应用程序的核心功能是从麦克风读取字节流并实时处理此流。因此,将音频流存储到文件并在录制停止后对其进行处理是不够的。
我已经找到了可以工作的AVAudioRecorder类,但我不知道如何实时处理数据流(过滤,发送到服务器等)。 AVAudioRecorder的init函数看起来像:
AVAudioRecorder(url: filename, settings: settings)
我需要的是一个类,我可以在其中注册一个事件处理程序或类似的东西,每次读取x个字节时都会调用它,以便我可以处理它。
这可能与AVAudioRecorder一起使用吗?如果没有,Swift库中还有另一个类允许我直播处理音频流吗?在Android中我使用android.media.AudioRecord所以如果在Swift中有一个等价的类,那将会很棒。
此致
答案 0 :(得分:0)
在Core Audio框架中使用音频队列服务。 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一个布尔值,指示音频队列是否为 运行