【问题标题】:AVAudioRecorder in Swift 3: Get Byte stream instead of saving to fileSwift 3 中的 AVAudioRecorder:获取字节流而不是保存到文件
【发布时间】:2017-09-14 08:16:59
【问题描述】:

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

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

AVAudioRecorder(url: filename, settings: settings)

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

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

问候

【问题讨论】:

  • 您找到解决方案了吗?我遇到了同样的问题。提前致谢!
  • 你找到解决方案了吗,我也遇到了同样的问题。

标签: ios swift microphone avaudiorecorder audio-processing


【解决方案1】:

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

【讨论】:

  • 很难找到 AudioQueue 的简单工作代码示例。大多数是一次性的,记录不充分且易碎
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多