2013-01-21 15 views
5

Ich empfange eine Reihe von UDP-Paketen von einem Socket mit codierten PCM-Puffern. Nachdem ich sie entschlüsselt habe, bleibt mir ein int16 * Audiopuffer, den ich sofort abspielen möchte.iOS: Wiedergabe von PCM-Puffern aus einem Stream

Die beabsichtigte Logik geht in etwa so:

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); 
} 

Ich bin nicht sicher über alles, was allerdings mit der Wiedergabe der Puffer zu tun hat. Bei Android kann ich dies erreichen, indem ich ein AudioTrack-Objekt erstelle, es durch Festlegen einer Abtastrate, eines Formats, von Kanälen usw. einrichte und dann einfach die "Schreib" -Methode mit dem Puffer aufrufen (wie ich es mir wünsche) Ich könnte in meinem Pseudo-Code oben) aber auf iOS komme ich kurz.

Ich habe versucht, die Audio File Stream Services zu verwenden, aber ich vermute, dass ich etwas falsch mache, da kein Ton jemals herauskommt und ich fühle, dass diese Funktionen selbst keine Wiedergabe machen. Ich habe auch versucht, die Audio Queue Services zu verstehen (was meiner Meinung nach nahe an meinen Wünschen liegt), konnte jedoch keine einfachen Codebeispiele finden.

Jede Hilfe wäre sehr geschätzt, vor allem in Form von Beispielcode.

+1

Hey, hast du es geschafft, es zu lösen? Ich habe ein ähnliches Problem, wenn möglich, bitte senden Sie ein Beispiel Ihres Codes. – moenad

Antwort

4

Sie müssen eine Art Puffer verwenden, um Ihre eingehenden UDP-Daten zu speichern. This ist ein einfacher und guter Ringpuffer, den ich benutzt habe.

Dann werden die Daten aus dem Puffer wiedergeben, können Sie Audio-Unit-Framework verwenden. Here ist ein gutes Beispielprojekt.

Hinweis: Der erste Link zeigt Ihnen auch, wie Sie mit Audio Unit wiedergeben.

+0

Ich bin immer noch ein bisschen ratlos darüber, wie es geht. Ich habe eine Empfangsrückruffunktion vom UDP-Sockel. Ich hole die PCM-Frames dort, also sage ich, dass ich einen Ringpuffer haben sollte, damit die Funktion die Frames, die sie dort abruft, und ein anderer Callback (den ich nicht so sicher weiß) den Puffer prüft und übergibt die Frames zur Wiedergabe mit dem Audio-Service? Aber was ruft den zweiten Rückruf an? Es scheint nicht so, als würde ich entscheiden, wann der Ton abgespielt wird. Ist das richtig? –

+0

Wenn Sie das Beispiel in meinem ersten Link betrachten, gibt es eine Funktion namens: audioOutputCallback. Es zeigt Ihnen, wie Sie Daten aus dem Ringspeicher in die Audio Unit-Wiedergabe kopieren. Ich habe gerade oben eine Kopie dieser Funktion erstellt. – user523234

+0

teilen Sie bitte Ihren Implementierungsteil –