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 Логическое значение, указывающее, работает ли аудио-очередь.