Pergunta

Estou escrevendo um aplicativo para iPhone que precisa gravar áudio no microfone embutido e enviar esses dados de áudio para um servidor para processamento.

O aplicativo usa uma conexão de soquete para se conectar ao servidor e serviços de fila de áudio para fazer a gravação. O que não tenho certeza é quando realmente enviar os dados. Os serviços de fila de áudio disparam um retorno de chamada cada vez que preencher um buffer com alguns dados de áudio. O NSOutputStream dispara um evento cada vez que tem espaço disponível.

Meu primeiro pensamento foi enviar os dados para o servidor no retorno de chamada da fila de áudio. Mas parece que isso terá um problema se o NSOutputStream não tivesse espaço disponível naquele momento.

Então pensei em buffer os dados quando eles voltam da fila de áudio e enviar alguns cada vez que o NSOutputStream dispara um evento disponível. Mas isso parece ter um problema se o envio para o servidor for adiantado da gravação de áudio, haverá uma situação em que não há nada para escrever no evento disponível, para que o evento não seja disparado novamente e a transferência de dados será efetivamente paralisado.

Então, qual é a melhor maneira de lidar com isso? Devo ter um cronômetro que dispare repetidamente e veja se há espaço disponível e há dados que precisam ser enviados? Além disso, acho que precisarei fazer alguma sincronização de threads para que eu possa retirar pedaços de dados do meu buffer para enviar pela rede, mas também adicionar pedaços de dados ao buffer à medida que a gravação prossegue sem arriscar o uso do meu buffer.

Foi útil?

Solução

Você pode usar um buffer de anel para manter um certo número de molduras de áudio e armações soltadas se o buffer exceder um determinado tamanho. Quando o seu retorno de chamada disponível no espaço é chamado, retire um quadro do buffer de anel e envie-o.

CHDATASTUTURAS Fornece algumas classes de buffer de anel (que chama de "tampão circular").

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top