Есть несколько способов записи звука с вашего приложения. Я расскажу о наборе функций из фраемворка AudioToolbox.
Запись осушествляется через специально подготовленные буфера, по мере их заполнения они отсылаются функции-слушателю, а там уже программист решает: записать буфер в файл, отправить в сеть или обработать как-то по своему. Но для начала нужно все подготовить.
Для задания формата входного буфера и параметров аудио используется структура AudioStreamBasicDescription. Эта структура передается в функцию AudioQueueNewInput, эта функция создает новый объект для записи.
- AudioStreamBasicDescription mDataFormat;
- mDataFormat.mFormatID = kAudioFormatLinearPCM;
- mDataFormat.mSampleRate = 44100;
- mDataFormat.mChannelsPerFrame = 1;
- mDataFormat.mBitsPerChannel = 16;
- mDataFormat.mBytesPerPacket =
- mDataFormat.mBytesPerFrame = mDataFormat.mChannelsPerFrame * sizeof(short int);
- mDataFormat.mFramesPerPacket = 1;
- mDataFormat.mFormatFlags = kLinearPCMFormatFlagIsBigEndian
- | kLinearPCMFormatFlagIsSignedInteger
- | kLinearPCMFormatFlagIsPacked;
- AudioQueueRef queue;
- AudioQueueNewInput(&mDataFormat, AQInputCallback,
- NULL, NULL, kCFRunLoopCommonModes, 0, &queue);
Вторым параметром задается функция-слушатель, которая вызывается по мере заполнения аудиобуферов. В ней и происходит вся работа по обработке аудио, будь то запись в файл или отсылка в сеть.
Теперь необходимо подготовить аудиобуферы в которые будет помещаться считанный аудиопоток. Функция AudioQueueAllocateBuffer выделяет память под буфер, а AudioQueueEnqueueBuffer добавляет к нашему объекту для записи полученный функцией AudioQueueNewInput.
- unsigned long frameSize = mDataFormat.mSampleRate * mDataFormat.mBytesPerFrame;
- AudioQueueBufferRef aBuffers[AUDIO_BUFFERS];
- for (int i=0; i<AUDIO_BUFFERS; i++)
- {
- AudioQueueAllocateBuffer(queue, frameSize, &aBuffers[i]);
- AudioQueueEnqueueBuffer(queue, aBuffers[i], 0, NULL);
- }
Подготовка закончена. Запускаем запись аудио функцией AudioQueueStart.
- AudioQueueStart(queue, NULL);
Остановить запись можно функцией AudioQueueStop:
- AudioQueueStop(queue, true);
И освобождение памяти от объекта queue функцией AudioQueueDispose
- AudioQueueDispose(queue, true);
Пример от Apple SpeakHere мне показался большим и сложным для понимания, мой более компактный.
Комментариев нет:
Отправить комментарий