Domanda

Sto scrivendo un'applicazione per iPhone che ha bisogno di registrare l'audio dal microfono incorporato e quindi inviare che i dati audio ad un server per l'elaborazione.

L'applicazione utilizza una connessione socket per la connessione al server e servizi coda audio per fare la registrazione. Quello che non sono sicuro di è quando inviare effettivamente i dati. Audio Coda Servizi spara un richiamata ogni volta che ha riempito un buffer con alcuni dati audio. NSOutputStream genera un evento ogni volta che ha spazio disponibile.

Il mio primo pensiero è stato quello di inviare i dati al server sul richiamata Audio coda. Ma sembra che questo sarebbe incorrere in un problema se il NSOutputStream non dispone di spazio disponibile in quel momento.

Poi ho pensato il buffering dei dati mentre ritorna dalla coda di audio e l'invio di un po 'ogni volta che il NSOutputStream spara uno spazio a disposizione per eventi. Ma questo sembra avere un problema se l'invio al server ottiene in vista della registrazione audio poi ci sarà una situazione in cui non c'è nulla da scrivere sul spazi per eventi disponibili, quindi l'evento non sarà licenziato di nuovo e il trasferimento dei dati sarà effectivly essere in fase di stallo.

Allora, qual è il modo migliore per gestire questa situazione? Dovrei avere un timer che spara più volte e vedere se c'è spazio a disposizione e non vi sono dati che deve essere inviato? Inoltre, penso che ho bisogno di fare un po 'la sincronizzazione dei thread in modo che possa prendere blocchi di dati dal mio tampone per inviare attraverso la rete, ma anche aggiungere quantità di dati nel buffer con il procedere della registrazione senza rischiare pressare la mia buffer.

È stato utile?

Soluzione

Si potrebbe utilizzare un buffer circolare per contenere un certo numero di frame audio e rilasciare fotogrammi se il buffer supera una certa dimensione. Quando il flusso di-ha-spazio-disponibile callback viene chiamato, tirare una cornice fuori dal buffer circolare e inviarlo.

CHDataStructures fornisce alcuni anello-buffer (che si chiama “buffer circolare”) classi .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top