Abspielen von Audio aus einem kontinuierlichen Datenstrom (iOS)

8

Habe mir den ganzen Morgen den Kopf gegen dieses Problem geschlagen.

Ich habe eine Verbindung zu einer Datenquelle hergestellt, die Audiodaten zurückgibt (Es ist ein Aufnahmegerät, also gibt es keine festgelegte Länge für die Daten. Die Daten strömen einfach ein. Wenn Sie beispielsweise einen Stream für ein Radio öffnen würden)

und ich habe es geschafft, alle Datenpakete in meinem Code zu empfangen. Jetzt muss ich es nur spielen. Ich möchte die eingehenden Daten abspielen, damit ich nicht ein paar Minuten warten muss. Ich möchte die Daten, die ich gerade empfange, in diesem Moment verwenden und abspielen.

Nun habe ich den ganzen Vormittag gesucht, um verschiedene Beispiele zu finden, aber keine wurden wirklich ausgelegt.

im

  • (void) Verbindung: (NSURLConnection ) Verbindung didReceiveData: (NSData ) Daten {

Funktion, das "Daten" -Paket ist das Audiopaket. Ich habe versucht, es mit AVPlayer, MFVideoPlayer zu streamen, aber bisher hat nichts für mich funktioniert. Auch versucht, den Audiostreamer von mattgallagher anzuschauen, konnte es aber immer noch nicht erreichen.

Wer hier helfen kann, hat (möglichst) Arbeitsbeispiele?

    
Tjirp 07.07.2011, 13:13
quelle

1 Antwort

2

Vorsicht: Die folgende Antwort ist nur gültig, wenn Sie PCM-Daten vom Server empfangen. Das ist natürlich nie passiert. Aus diesem Grund benötigen Sie zwischen dem Rendern des Audiomaterials und dem Empfangen der Daten einen weiteren Schritt: Datenkonvertierung.

Je nach Format kann dies mehr oder weniger kompliziert sein, aber im Allgemeinen sollten Sie für diesen Schritt die Audio Converter-Dienste verwenden.

Sie sollten -(void)connection:(NSURLConnection )connection didReceiveData:(NSData)data nur verwenden, um einen Puffer mit den Daten zu füllen, die vom Server kommen. Das Abspielen sollte nichts mit dieser Methode zu tun haben.

Um nun die Daten, die Sie mit dem Pufferspeicher gespeichert haben, abzuspielen, müssen Sie RemoteIO und Audioeinheiten verwenden. Hier ist ein gutes, umfassendes Tutorial . Sie können den "Aufnahme" -Teil aus dem Tutorial entfernen, da Sie ihn nicht wirklich brauchen.

Wie Sie sehen, definieren sie einen Rückruf für die Wiedergabe:

%Vor%

und playbackCallback Funktion sieht so aus:

%Vor%

Im Grunde wird der ioData Puffer mit dem nächsten Teil der Bytes gefüllt, die gespielt werden müssen. Stellen Sie sicher, dass Sie den ioData -Puffer auf Null setzen (stilllegen), wenn keine neuen Daten mehr abgespielt werden (der Player wird stumm geschaltet, wenn nicht genügend Daten im Stream-Puffer vorhanden sind).

Sie können dasselbe auch mit OpenAL erreichen, indem Sie alSourceQueueBuffers und alSourceUnqueueBuffers verwenden, um die Puffer nacheinander zu laden.

Das ist es. Happy Codding!

    
Valentin Radu 07.07.2011, 15:11
quelle