2013-01-21 13 views
5

Ricevo una serie di pacchetti UDP da un socket contenente buffer PCM codificati. Dopo averli decodificati, mi rimane un buffer audio int16 *, che mi piacerebbe riprodurre immediatamente.iOS: riproduzione di buffer PCM da un flusso

La logica previsto più o meno così:

init(){ 
    initTrack(track, output, channels, sample_rate, ...); 
} 

onReceiveBufferFromSocket(NSData data){ 
    //Decode the buffer 
    int16 * buf = handle_data(data); 

    //Play data 
    write_to_track(track, buf, length_of_buf, etc); 
} 

Non sono sicuro su tutto ciò che ha a che fare con la riproduzione dei buffer però. Su Android, sono in grado di realizzare questo creando un oggetto AudioTrack, impostandolo specificando una frequenza di campionamento, un formato, canali, ecc ... e quindi semplicemente chiamando il metodo "write" con il buffer (come vorrei Potrei farlo nel mio pseudo-codice sopra), ma su iOS non mi sento in forma.

Ho provato a utilizzare i servizi di flusso di file audio, ma suppongo che stia facendo qualcosa di sbagliato poiché non viene mai emesso alcun suono e ho l'impressione che tali funzioni da sole non eseguano alcuna riproduzione. Ho anche tentato di capire i servizi di coda audio (che penso potrebbe essere vicino a quello che voglio), tuttavia non sono riuscito a trovare alcun esempio di codice semplice per il suo utilizzo.

Qualsiasi aiuto sarebbe molto apprezzato, specialmente sotto forma di codice di esempio.

+1

Ehi, sei riuscito a risolverlo? Sto riscontrando un problema simile, se possibile, pubblica un esempio del tuo codice. – moenad

risposta

4

È necessario utilizzare un tipo di buffer per contenere i dati UDP in entrata. This è un buffer circolare facile e buono che ho usato.

Quindi per riprodurre i dati dal buffer, è possibile utilizzare la struttura dell'unità audio. Here è un buon esempio di progetto.

Nota: il primo collegamento mostra anche come riprodurre utilizzando l'unità audio.

+0

Sono ancora un po 'incapace di come farlo. Ho una funzione di callback di ricezione dal socket UDP. Vado a prendere i frame PCM lì, quindi quello che stai dicendo è che dovrei avere un buffer circolare in modo che la funzione possa mettere i frame che recupera lì, e un altro callback (che non sono troppo sicuro di come fare) controlla il buffer e invia i frame per la riproduzione usando il servizio audiounit? Ma cosa chiama la seconda richiamata? Non sembra che io possa decidere quando l'audio viene riprodotto, è corretto? –

+0

Se si guarda l'esempio nel mio primo collegamento, c'è una funzione chiamata: audioOutputCallback. Mostra come copiare i dati dal buffer circolare nella riproduzione dell'unità audio. Ho appena fatto una copia di quella funzione qui sopra. – user523234

+0

si prega di condividere la parte di implementazione –