AVAudioRecorder в Swift 3: получить поток байтов вместо сохранения в файл

Я новичок в программировании на iOS и хочу портировать приложение Android на iOS с помощью Swift 3. Основная функция приложения - читать поток байтов с микрофона и обрабатывать этот поток в реальном времени. Поэтому недостаточно сохранить аудиопоток в файл и обработать его после остановки записи.

Я уже нашел класс AVAudioRecorder, который работает, но я не знаю, как обрабатывать поток данных в реальном времени (фильтрация, отправка на сервер и т. Д.). Функция init AVAudioRecorder выглядит так:

AVAudioRecorder(url: filename, settings: settings)

Мне нужен класс, в котором я могу зарегистрировать обработчик события или что-то в этом роде, который вызывается каждый раз, когда читаются x байтов, чтобы я мог его обработать.

Это возможно с AVAudioRecorder? Если нет, есть ли другой класс в библиотеке Swift, который позволяет мне обрабатывать аудиопотоки в прямом эфире? В Android я использую android.media.AudioRecord, поэтому было бы здорово, если бы в Swift был эквивалентный класс.

С уважением

1 ответ

Используйте сервис Audio Queue в Core Audio Framework. https://developer.apple.com/library/content/documentation/MusicAudio/Conceptual/AudioQueueProgrammingGuide/AQRecord/RecordingAudio.html

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 см. Справочник типов данных Audio Core.

3 Запись аудио-очереди, созданной вашим приложением.

4 Массив, содержащий указатели на буферы аудио-очереди, управляемые аудио-очередью.

5 Объект аудиофайла, представляющий файл, в который ваша программа записывает аудиоданные.

6 Размер в байтах для каждого буфера аудио-очереди. Это значение вычисляется в этих примерах в функции DeriveBufferSize после создания аудио-очереди и до ее запуска. См. Запись функции для получения размера буфера аудио-очереди записи.

7 Индекс пакета для первого пакета, который будет записан из текущего буфера аудио-очереди.

8 Логическое значение, указывающее, работает ли аудио-очередь.

Другие вопросы по тегам