【问题标题】:Playing multiple audios simultaneously with MediaPlayer使用 MediaPlayer 同时播放多个音频
【发布时间】:2018-05-08 18:43:00
【问题描述】:

我在同时播放两个 MediaPlayers 时遇到问题。

在我的代码中,我创建了一个spinner 让用户选择他的第一首歌曲,然后选择第二首歌曲,在用户选择第一首歌曲的那一刻开始播放,当用户选择第二首歌曲时会和第一个一起玩。

但问题是,当用户播放第二首歌曲时,它会停止第一首...

我能做些什么来解决它?

泰!

代码:

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

【问题讨论】:

  • 您正在使用单个 MediaPlayer 实例。您是否尝试过创建两个MediaPlayers?
  • 我正在使用 2 个媒体播放器...
  • 不在此代码中,您不在。请参阅下面的答案。

标签: android spinner android-mediaplayer


【解决方案1】:

试试 SoundPool,它是同时处理多个音频文件的更好方法。

这是文档:

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

示例如下:

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

希望对你有帮助

Reference

【讨论】:

  • 您好,感谢您的回复。我知道 soundpool 是用于短音频的,这是真的吗?
  • 是的,它适用于短音频
  • 我也需要一些可以处理长音频的东西......你知道一些可以帮助我的方法吗?
  • 我会搜索并告诉你,如果我发现了什么
  • 嗨,你有什么想法吗?
【解决方案2】:

尝试使用两个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 实例相比,同时播放两首歌曲的机会更大。

【讨论】:

  • 我要试试,你!
  • 你知道有没有办法在没有微调器的情况下同时播放它们?因为我尝试了很多方法来做到这一点,但每次只有一个媒体播放器工作......
  • 微调器应该与情况无关。如果它与微调器一起使用,它应该可以在没有的情况下使用。它可能依赖于很多东西,但它应该可以工作。尽管是在旨在播放媒体的自定义硬件上完成的。
  • @mike23 运气好吗?
猜你喜欢
  • 2015-02-13
  • 1970-01-01
  • 2015-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多