Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

ХДАТАСТРУКЦИЯ Предоставляет несколько кольцевых буферов (которые он называет «круговым буфером»).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top