2012-01-08 5 views
5

Po pierwsze, muszę generować 2 fale sinusoidalne w locie, które są tej samej częstotliwości, ale przeciwne fazy i odtwarzać je z powrotem oddzielnie na prawym i lewym kanale w trybie stereo na Androidzie. Odtwarzanie musi być idealnie zsynchronizowane, tak aby sinusy lewego i prawego kanału były "odbijane" (gdy ma się lewy kanał, np. Próbka o wartości 120, prawy kanał powinien mieć -120).Jak odtwarzać lewy i prawy kanał oddzielnie za pomocą funkcji AudioTrack?

Chodzi o to, że nie znalazłem żadnych dowodów na to, jak ten rodzaj konfiguracji zadziała. Czy istnieje możliwość dodania 2 oddzielnych tonów/buforów próbkowania do AudioTrack, aby odtwarzać je w lewym i prawym kanale osobno i jednocześnie? Jeśli nie, wszelkie inne rozwiązania, aby osiągnąć końcowy wynik są bardzo doceniane.

Domyślam się, że jedną z opcji byłoby użycie wygenerowanych fabrycznie falowych plików stereo i przesłanie ich w postaci AudioTrack, ale wydaje się to zbyt mało elastyczne w przypadku rozwiązania problemu. W tym samym czasie, jeśli AudioTrack jest w stanie odtwarzać te nagrane pliki audio w "rzeczywistym" trybie stereo, spodziewałbym się, że to samo będzie możliwe z wygenerowanymi dźwiękami.

+2

Dzięki niko20 w Androida grupy użytkowników: „Nie trzeba osobny bufor dla prawej i lewej audio stereo jest przeplatane do Ouput stereo wystarczy wypełnić bufor z lewo-prawo-lewym prawy- ..”.To naprawdę działa dobrze, testowałem z AudioTrack – rar

Odpowiedz

0

OK, może to zadziałać, ponieważ istnieją tylko dwie próbki.

Najpierw sprawdź wydanie SoundPool. Jest to przydatne, gdy masz ścieżki, które wymagają dobrej wydajności, ponieważ są całkowicie załadowane do pamięci. Ma to jednak wady, z których główny jest ograniczeniem rozmiaru ścieżek przechowywanych w pamięci. Kiedy po raz pierwszy użyłem tego, próbowałem umieścić 2 x 4Mb w strumieniu - to nie był dobry pomysł.

SoundPool ma tę funkcję:

setVolume(int streamID, float leftVolume, float rightVolume) 

zauważyć, jak można ustawić poziom głośności dla lewego i prawego dla każdego strumienia? W przypadku strumienia 1 można uzyskać maksymalnie lewy wolumin, a następnie strumień 2 - maksymalny poziom głośności.

Chciałbym skonfigurować strumienie z plikami do odtwarzania i głośności zgodnie z potrzebami, a następnie odtwarzać je.

Mały przewodnik znajduje się w http://www.vogella.de/articles/AndroidMedia/article.html

+0

OK Rozumiem, co masz na myśli, ale SoundPool niestety nie pomaga mi tak bardzo, jak potrzebuję generować dźwięki w moim kodzie i używać AudioTrack i MODE_STREAM w celu zasilenia bufora odtwarzania w locie . Funkcja AudioTrack obsługuje konfiguracje CHANNEL_OUT_MONO i CHANNEL_OUT_STEREO, ale nie znalazłem opcji, aby faktycznie przekazywać różne dźwięki generowane przez kod do lewego i prawego kanału. – rar

5

AudioTrack ten sam sposób jak SoundPool. To zadzwoń

AudioTrack.setStereoVolume();

Jeśli chcesz grać kanał lewy/prawy jednocześnie z różnymi danymi. Powinieneś obsługiwać dane, aby osiągnąć ten cel. Jeśli wybierzesz tryb stereo z 16Bit PCM, dane dla bajtu dla lewego i bajtu dla bajtów są jednobajtowe. Na przykład:

lewy kanał chcesz grać: 12, 23, 34, 45

prawy kanał chcesz grać: 54, 43, 32, 21 w tym samym czasie z lewego kanału.

dane powinny być wytwarzane jako: {12, 54, 23, 43, 34, 32, 45, 21}

Następnie za pomocą AudioTrack.write (dane). Doskonale spełni twój cel.

+0

Czy to prawda? Czy muszę umieścić jeden element każdego kanału wymienianego wzdłuż bufora wyjściowego? –

+0

Próbuję zrobić pojedynczy kanał dla dźwięku mono, ale odkryłem, że teraz jest to zrobione przez public int setVolume (gain float) Dodano na poziomie API 21 Ustawia określoną wartość wzmocnienia na wszystkich kanałach tego utworu. Ten interfejs API jest preferowany w stosunku do setStereoVolume (float, float), ponieważ bardziej płynnie skaluje się do mono, a nawet do zawartości wielokanałowej poza stereo. Jak mam to teraz kontrolować? – VMMF