Запись аудио на iPhone и отправка по сети с помощью NSOutputStream - PullRequest
2 голосов
/ 15 марта 2010

Я пишу приложение для iPhone, которое должно записывать звук со встроенного микрофона, а затем отправлять эти аудиоданные на сервер для обработки.

Приложение использует разъем для подключения к серверу иAudio Queue Services, чтобы сделать запись.В чем я не уверен, так это когда отправлять данные.Audio Queue Services запускает обратный вызов каждый раз, когда он заполняет буфер некоторыми аудиоданными.NSOutputStream запускает событие каждый раз, когда у него есть свободное место.

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

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

Так, каков наилучший способ справиться с этим?Должен ли я иметь таймер, который запускается несколько раз и посмотреть, есть ли свободное место и есть ли данные, которые нужно отправить?Кроме того, я думаю, что мне нужно будет выполнить некоторую синхронизацию потоков, чтобы я мог вынимать порции данных из буфера для отправки по сети, а также добавлять порции данных в буфер по мере того, как запись продолжается, не рискуя исказить мой буфер.

1 Ответ

3 голосов
/ 15 марта 2010

Вы можете использовать кольцевой буфер для хранения определенного количества аудио кадров и отбрасывания кадров, если буфер превышает определенный размер. Когда ваш обратный вызов stream-has-space-available будет вызван, вытяните кадр из кольцевого буфера и отправьте его.

CHDataStructures предоставляет несколько классов кольцевого буфера (который он называет «кольцевым буфером»).

...