Запись звука на iPhone и отправка по сети с помощью NSOutputStream

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

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

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

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

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


person Mark Kanof    schedule 15.03.2010    source источник


Ответы (1)


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

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

person Peter Hosey    schedule 15.03.2010
comment
Спасибо, Питер, я раньше не сталкивался с этими структурами данных. Похоже, это может быть полезно, хотя я выполняю распознавание речи на стороне сервера, поэтому я не знаю, могу ли я безопасно отбрасывать кадры, не влияя на точность. Знаете ли вы о поточно-ориентированной структуре очереди для objective-c. Я искал и ничего не нашел. Может, мне придется написать свой собственный. - person Mark Kanof; 15.03.2010
comment
Я понятия не имею о потокобезопасности классов в структуре, с которой я связался. Вы должны прочитать его документацию и посмотреть, что в ней написано. - person Peter Hosey; 15.03.2010
comment
@PeterHosey Не могли бы вы объяснить мне, как вы отправляли данные из функции обратного вызова на сервер? Я не могу понять, как написать код obj-c в этой функции обратного вызова, чтобы извлечь аудиоданные из буфера и отправить их на сервер. - person Javal Nanda; 15.03.2012
comment
@JavalNanda: Вы должны задать об этом отдельный вопрос. - person Peter Hosey; 15.03.2012