Korzystanie z AudioTrack w Androidzie do odtwarzania pliku WAV

Pracuję z Androidem, starając się, aby moja aplikacja AudioTrack odtwarzała System Windows .plik wav (Tadż.wav). Szczerze mówiąc, to nie powinno być takie trudne, ale słyszę wiele dziwnych rzeczy. Plik jest zapisany na mini karcie SD mojego telefonu i czytanie zawartości nie wydaje się być problemem, ale kiedy odtwarzam Plik (z parametrami jestem tylko prawie pewien, że masz rację), dostaję kilka sekund białego szumu, zanim dźwięk wydaje się rozwiązać się w coś, co może być właściwe.

Mam z powodzeniem nagrałem i odtworzyłem własny głos przez telefon .stworzyłemplik pcm zgodnie ze wskazówkami w tym przykładzie:

Http://emeadev.blogspot.com/2009/09/raw-audio-manipulation-in-android.html

(bez maskowania do tyłu)...

Ktoś ma jakieś sugestie lub orientację na przykład w sieci do gry a .plik wav na Androidzie??

Dzięki, R.

Author: Rich, 2010-10-13

5 answers

Natknąłem się na odpowiedź (szczerze mówiąc, próbując&^@! Nie sądziłem, że zadziała), w razie gdyby ktoś był zainteresowany... W moim oryginalnym kodzie (który pochodzi z przykładu w linku w oryginalnym poście) dane są odczytywane z pliku w następujący sposób:

    InputStream             is  = new FileInputStream       (file);
    BufferedInputStream     bis = new BufferedInputStream   (is, 8000);
    DataInputStream         dis = new DataInputStream       (bis);      //  Create a DataInputStream to read the audio data from the saved file

    int i = 0;                                                          //  Read the file into the "music" array
    while (dis.available() > 0)
    {
        music[i] = dis.readShort();                                     //  This assignment does not reverse the order
        i++;
    }

    dis.close();                                                        //  Close the input stream

W tej wersji muzyka [] to Tak więc metoda readShort () wydaje się mieć tutaj sens, ponieważ dane są 16-bitowym PCM... Jednak na Androidzie to wydaje się być problemem. Zmieniłem ten kod na "po": {]}

     music=new byte[(int) file.length()];//size & length of the file
    InputStream             is  = new FileInputStream       (file);
    BufferedInputStream     bis = new BufferedInputStream   (is, 8000);
    DataInputStream         dis = new DataInputStream       (bis);      //  Create a DataInputStream to read the audio data from the saved file

    int i = 0;                                                          //  Read the file into the "music" array
    while (dis.available() > 0)
    {
        music[i] = dis.readByte();                                      //  This assignment does not reverse the order
        i++;
    }

    dis.close();                                                        //  Close the input stream

W tej wersji muzyka[] jest tablicą bajtów. Nadal mówię Audiotrackowi, że to 16-bitowe dane PCM, a mój Android nie wydaje się mieć problemu z zapisaniem tablicy bajtów do tak skonfigurowanego Audiotracka... W każdym razie, w końcu brzmi dobrze, więc jeśli ktoś jeszcze chce odtwarzać dźwięki systemu Windows na swoim Androidzie, z jakiegoś powodu, to jest rozwiązanie. Endianess......

R.

 26
Author: Rich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-06 07:09:19

Znalazłem wiele długich odpowiedzi na to pytanie. Moje ostateczne rozwiązanie, które biorąc pod uwagę całe cięcie i wklejanie jest prawie moje, sprowadza się do: {]}

public boolean play() {

    int i = 0;
    byte[] music = null;
    InputStream is = mContext.getResources().openRawResource(R.raw.noise);

    at = new AudioTrack(AudioManager.STREAM_MUSIC, 44100,
        AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT,
        minBufferSize, AudioTrack.MODE_STREAM);

    try{
        music = new byte[512];
        at.play();

        while((i = is.read(music)) != -1)
            at.write(music, 0, i);

    } catch (IOException e) {
        e.printStackTrace();
    }

    at.stop();
    at.release();
    return STOPPED;
}

STOPPED to po prostu "prawda" wysyłana z powrotem jako sygnał do zresetowania przycisku pauzy/odtwarzania. I w klasie inicjalizator:

public Mp3Track(Context context) {
    mContext = context;
    minBufferSize = AudioTrack.getMinBufferSize(44100,
        AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT);
}

Kontekst jest po prostu "tym" z działania wywołującego. Możesz użyć strumienia plików na karcie SD, itp. Moje pliki są w res / raw

 7
Author: R Earle Harris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-28 18:36:11

Czy pomijasz pierwsze 44 bajty pliku, zanim wrzucisz resztę danych do bufora? Pierwsze 44 bajty to nagłówek WAVE i brzmiałyby jak przypadkowy szum, gdybyś spróbował je odtworzyć.

Również, czy jesteś pewien, że tworzysz AudioTrack z tymi samymi właściwościami co fala, którą próbujesz odtworzyć (częstotliwość próbkowania, przepływność, liczba kanałów itp.)? Windows faktycznie robi dobrą robotę podając te informacje we właściwościach pliku strona: alt text

 5
Author: Aaron C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-14 14:35:31

Jak powiedział Aaron C, musisz pominąć początkowe 44 bajty lub (jak wolę) przeczytać pierwsze 44 bajty, które są nagłówkiem Wave. W ten sposób wiesz, ile kanałów, bitów na próbkę, długość itp... fala zawiera.

Tutaj znajdziesz dobrą implementację parsera nagłówka/Writera.

 2
Author: sixro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:00:17

Proszę nie utrwalać strasznego kodu parsującego. Parsowanie WAV jest trywialne w implementacji http://soundfile.sapp.org/doc/WaveFormat/ podziękujesz sobie, będąc w stanie analizować takie rzeczy, jak częstotliwość próbkowania, Głębokość bitowa i liczba kanałów.

Również x86 i ARM (przynajmniej domyślnie) są małymi endianami, więc natywne pliki WAV endian powinny być w porządku bez tasowania.

 1
Author: yano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-22 19:47:04