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

时间:2017-04-18 13:05:34

标签: ios swift microphone avaudiorecorder audio-processing

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

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

AVAudioRecorder(url: filename, settings: settings)

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

这可能与AVAudioRecorder一起使用吗?如果没有,Swift库中还有另一个类允许我直播处理音频流吗?在Android中我使用android.media.AudioRecord所以如果在Swift中有一个等价的类,那将会很棒。

此致

1 个答案:

答案 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一个布尔值,指示音频队列是否为   运行