Воспроизведение нескольких аудио одновременно с MediaPlayer - PullRequest
0 голосов
/ 04 мая 2018

У меня проблема с одновременной игрой двух MediaPlayers.

В своем коде я сделал spinner, чтобы позволить пользователю выбрать свою первую песню, а затем вторую песню, в тот момент, когда пользователь выбирает первую песню, которую он начинает воспроизводить, и когда пользователь выбирает вторую песню, будет играть с первым.

Но проблема в том, что когда пользователь выбирает вторую песню, он останавливает первую ...

Что я могу сделать, чтобы это исправить?

Ty!

код:

public void setSpinner() {
    Spinner spine = (Spinner) findViewById(R.id.spinner3);
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.song, android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spine.setAdapter(adapter);
    final MediaPlayer mp1 = new MediaPlayer();
    spine.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
    {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            String st = parent.getItemAtPosition(position).toString();
            if (st.equals("First Song")) {
                setMedia1(mp1);
                mp1.start();
            }
            if (st.equals("Second Song")) {
                setMedia2(mp1);
                mp1.start();
            }
        }
        @Override
        public void onNothingSelected(AdapterView<?> parent) {
        }
    });
}
public void setMedia1(MediaPlayer mp2) {

    Bundle b1=getIntent().getExtras();
    float s = b1.getFloat("speed");
    Bundle b2=getIntent().getExtras();
    float v = b2.getFloat("volume");

    try {
        String s1 = getIntent().getStringExtra("song1");
        final Uri uri1 = Uri.parse(s1);
        mp2.setDataSource(getApplicationContext(), uri1);
        mp2.prepare();
        mp2.setVolume(v,v);
        mp2.setPlaybackParams(mp2.getPlaybackParams().setSpeed(s));
    } catch (Exception e) {
    }

}
public void setMedia2(MediaPlayer mp2) {

    Bundle b3 = getIntent().getExtras();
    float sp1 = b3.getFloat("speed1");
    Bundle b4 = getIntent().getExtras();
    float vo1 = b4.getFloat("volume1");

    try {
        String s2 = getIntent().getStringExtra("song3");
        final Uri uri2 = Uri.parse(s2);
        mp2.setDataSource(getApplicationContext(), uri2);
        mp2.prepare();
        mp2.setVolume(vo1, vo1);
        mp2.setPlaybackParams(mp2.getPlaybackParams().setSpeed(sp1));
    } catch (Exception e) {
    }
}

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Попробуйте использовать два MediaPlayer экземпляра. Измените свой setSpinner метод, чтобы сделать что-то вроде:

public void setSpinner() {
    Spinner spine = (Spinner)findViewById(R.id.spinner3);
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.song, android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spine.setAdapter(adapter);
    // You were only creating a single MediaPlayer instance in your version...
    final MediaPlayer mpA = new MediaPlayer();
    final MediaPlayer mpB = new MediaPlayer();
    spine.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
    {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            String st = parent.getItemAtPosition(position).toString();
            if (st.equals("First Song")) {
                // Use mpA for the first song
                setMedia1(mpA);
                mpA.start();
            }
            else if (st.equals("Second Song")) {
                // Use mpB for the second song
                setMedia2(mpB);
                mpB.start();
            }
        }
        @Override
        public void onNothingSelected(AdapterView<?> parent) {
        }
    });
}

Я не знаю, даст ли это именно то поведение, которое вы ищете, но у него больше шансов воспроизвести две песни одновременно, чем при использовании одного экземпляра MediaPlayer.

0 голосов
/ 04 мая 2018

попробуйте SoundPool, это лучший способ работать с несколькими аудиофайлами одновременно.

Вот документация:

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

Вот пример:

http://examples.javacodegeeks.com/android/android-soundpool-example

Надеюсь, это поможет

Ссылка

...