2010-03-15 5 views
2

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

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

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

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

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

ответ

3

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

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

+0

Спасибо, Питер, я не сталкивался с этими структурами данных раньше. Кажется, что это может быть полезно, хотя я делаю распознавание речи на стороне сервера, поэтому я не знаю, что могу безопасно отказаться от кадров без повышения точности. Вы знаете структуру потоковой безопасности очереди для объектного-c. Я искал вокруг и ничего не нашел. Может быть, я должен написать свое. –

+0

Я понятия не имею о безопасности потоков для классов в рамках, с которыми я связан. Вы должны прочитать его документацию и посмотреть, что она говорит. –

+0

@PeterHosey Можете ли вы объяснить мне, как вы отправили данные с функции обратного вызова на сервер? Я не могу понять, как написать код obj-c в этой функции обратного вызова, чтобы извлечь аудиоданные из буфера и отправить их на сервер –

 Смежные вопросы

  • Нет связанных вопросов^_^