2013-01-21 11 views
5

Otrzymuję serię pakietów UDP z gniazda zawierającego zakodowane bufory PCM. Po ich zdekodowaniu pozostawiam bufor dźwiękowy int16 *, który chciałbym od razu odtworzyć.iOS: Odtwarzanie buforów PCM ze strumienia

Zamierzony logika idzie mniej więcej tak:

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

Nie jestem pewien, o wszystkim, co ma zrobić z odtwarzanie bufory chociaż. Na Androidzie mogę to osiągnąć, tworząc obiekt AudioTrack, ustawiając go, określając częstotliwość próbkowania, format, kanały itp., A następnie po prostu wywołując metodę "zapisu" z buforem (jakbym sobie życzył Mógłbym w moim pseudo-kodzie powyżej), ale na iOS niedługo będę musiał.

Próbowałem użyć usługi strumieniowego przesyłania plików audio, ale domyślam się, że robię coś nie tak, ponieważ nigdy nie słychać żadnego dźwięku i mam wrażenie, że te funkcje same w sobie nie powodują żadnego odtwarzania. Próbowałem również zrozumieć usługi kolejkowania audio (które moim zdaniem mogą być bliskie temu, czego chcę), jednak nie mogłem znaleźć żadnych prostych próbek kodu do jego wykorzystania.

Każda pomoc zostanie bardzo doceniona, szczególnie w formie przykładowego kodu.

+1

Hej, udało ci się go rozwiązać? Mam podobny problem, jeśli to możliwe, opublikuj próbkę swojego kodu. – moenad

Odpowiedz

4

Musisz użyć jakiegoś bufora do przechowywania przychodzących danych UDP. This to prosty i dobry bufor cykliczny, z którego korzystałem.

Następnie w celu odtworzenia danych z bufora można użyć struktury Audio Unit. Here to dobry przykładowy projekt.

Uwaga: Pierwsze łącze pokazuje również sposób odtwarzania za pomocą urządzenia audio.

+0

Nadal nie mam pojęcia, jak to zrobić. Mam funkcję oddzwaniania odbioru z gniazda UDP. Pobieram tam ramki PCM, więc mówię, że powinienem mieć bufor cykliczny, aby funkcja mogła umieszczać w niej ramki, a inne wywołanie zwrotne (którego nie jestem zbyt pewny, jak wykonać) sprawdza bufor i przesyła klatki do odtwarzania za pomocą usługi audiounit? Ale co wywołuje drugie wywołanie zwrotne? Wygląda na to, że nie decyduję, kiedy gra dźwięk, czy to prawda? –

+0

Jeśli spojrzysz na przykład w moim pierwszym linku, istnieje funkcja o nazwie: audioOutputCallback. Pokazuje sposób kopiowania danych z okrągłego bufora do odtwarzania jednostki audio. Właśnie zrobiłem kopię tej funkcji powyżej. – user523234

+0

proszę udostępnić swoją część implementacyjną –

Powiązane problemy