2012-06-29 14 views
17

Mam obecnie dźwięk PCM w postaci tablicy bajtów. Format jest podpisany 16 bit little endian. Chciałbym przekonwertować to na format obsługiwany w systemie Android, najlepiej w wersji 3.2 lub wyższej. Czy ktoś ma sugestie, jak to zrobić? Zrobiłem kilka badań i próbowałem poniższych kroków, ale żadna nie odniosła sukcesu. Byłoby bardzo cenne, gdyby ktokolwiek mógł zaproponować lepszy sposób lub wskazać, gdzie popełniłem błąd.PCM Raw Bytes [] To Audio na Androidzie

Próbowałem już utworzyć AudioFormat z poprawnymi ustawieniami audio, jednak Android nie obsługuje biblioteki javax.sound.sampled.

Próbowałem również zapisywać dane PCM do pliku wave, ale mam problem z uzyskaniem wszystkich niezbędnych informacji w nagłówku wav.

Próbowałem również użyć klasy AudioTrack oferowanej przez Androida do odtwarzania danych PCM. Jednak wydaje mi się, że nie słyszę żadnego dźwięku. Oto moja metoda:

public void playback(){ 
     try{ 
       AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, 8000, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, 500000, AudioTrack.MODE_STATIC); 
       audioTrack.write(audio, 0, 500000); 

     } catch(Throwable t){ 
     Log.d("Audio","Playback Failed"); 
    } 
} 

Wszelkie sugestie będą mile widziane.

+0

zaktualizowałeś moją odpowiedź –

Odpowiedz

19

http://developer.android.com/reference/android/media/AudioTrack.html

Klasa ta wygląda to dokładnie to, czego potrzebujesz!

write(byte[] audioData, int offsetInBytes, int sizeInBytes) 

Zapisuje dane audio do sprzętu audio w celu odtworzenia.

EDIT

Zmień swój strumień AudioManager.STREAM_MUSIC

+0

Dziękuję za skierowanie mnie do naprawy strumienia. Przyczyniło się to do usunięcia błędu. – ShannonS

+6

Wybierz prawidłową odpowiedź, która pomoże Ci uzyskać więcej odpowiedzi w przyszłości. –

17

Powstaje pytanie, czy chcesz grać próbek PCM otrzymanych z jakiegoś źródła bezpośrednio w aplikacji na Androida lub jeśli masz jakieś pliki zewnętrzne trzeba konwertować. W pierwszym przypadku idź tak, jak opisał to jack57. To naprawdę proste i możesz nawet dodać znaczniki, aby mieć dokładny czas.

int bufferSize = AudioTrack.getMinBufferSize(sampleRate, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT); 

AudioTrack mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize, AudioTrack.MODE_STREAM); 

mAudioTrack.play(); 

następnie wywołać metodę zapisu w cyklu:

mAudioTrack.write(buffer, 0, buffer.length); 

W drugim przypadku wystarczy użyć jakiś darmowy edytor audio: http://audacity.sourceforge.net/download/. Możesz przechowywać próbki PCM jako plik .txt, otwierać je w edytorze i zapisywać w formacie, którego potrzebujesz ...

+0

Dziękuję za opracowanie. Pomogło mi to naprawić błąd. – ShannonS