25 августа 2010 г.

Запись аудио с микрофона iPhone

Во времена прошивок 2.х для меня стало открытием, что подключив гарнитуру к iPod Touch можно использовать микрофон для записи аудио. А вот в 3-й прошивке появилось приложение "Диктофон", так что возможность подключения микрофона стала очевидной.

Есть несколько способов записи звука с вашего приложения. Я расскажу о наборе функций из фраемворка AudioToolbox.

Запись осушествляется через специально подготовленные буфера, по мере их заполнения они отсылаются функции-слушателю, а там уже программист решает: записать буфер в файл, отправить в сеть или обработать как-то по своему. Но для начала нужно все подготовить.

Для задания формата входного буфера и параметров аудио используется структура AudioStreamBasicDescription. Эта структура передается в функцию AudioQueueNewInput, эта функция создает новый объект для записи.

  1. AudioStreamBasicDescription mDataFormat;
  2. mDataFormat.mFormatID = kAudioFormatLinearPCM;
  3. mDataFormat.mSampleRate = 44100;
  4. mDataFormat.mChannelsPerFrame = 1;
  5. mDataFormat.mBitsPerChannel = 16;
  6. mDataFormat.mBytesPerPacket =
  7. mDataFormat.mBytesPerFrame = mDataFormat.mChannelsPerFrame * sizeof(short int);
  8. mDataFormat.mFramesPerPacket = 1;
  9. mDataFormat.mFormatFlags = kLinearPCMFormatFlagIsBigEndian
  10. | kLinearPCMFormatFlagIsSignedInteger
  11. | kLinearPCMFormatFlagIsPacked;
  12. AudioQueueRef queue;
  13. AudioQueueNewInput(&mDataFormat, AQInputCallback,
  14. NULL, NULL, kCFRunLoopCommonModes, 0, &queue);


Вторым параметром задается функция-слушатель, которая вызывается по мере заполнения аудиобуферов. В ней и происходит вся работа по обработке аудио, будь то запись в файл или отсылка в сеть.

Теперь необходимо подготовить аудиобуферы в которые будет помещаться считанный аудиопоток. Функция AudioQueueAllocateBuffer выделяет память под буфер, а AudioQueueEnqueueBuffer добавляет к нашему объекту для записи полученный функцией AudioQueueNewInput.

  1. unsigned long frameSize = mDataFormat.mSampleRate * mDataFormat.mBytesPerFrame;
  2. AudioQueueBufferRef aBuffers[AUDIO_BUFFERS];
  3. for (int i=0; i<AUDIO_BUFFERS; i++)
  4. {
  5. AudioQueueAllocateBuffer(queue, frameSize, &aBuffers[i]);
  6. AudioQueueEnqueueBuffer(queue, aBuffers[i], 0, NULL);
  7. }


Подготовка закончена. Запускаем запись аудио функцией AudioQueueStart.

  1. AudioQueueStart(queue, NULL);


Остановить запись можно функцией AudioQueueStop:

  1. AudioQueueStop(queue, true);


И освобождение памяти от объекта queue функцией AudioQueueDispose

  1. AudioQueueDispose(queue, true);


Пример от Apple SpeakHere мне показался большим и сложным для понимания, мой более компактный.

Комментариев нет:

Отправить комментарий