gpt4 book ai didi

android - MediaPlayer同时播放多首歌曲 : only one is really playing

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:30:23 39 4
gpt4 key购买 nike

我需要有关在 Android 中同时播放多个音轨的帮助。

我应该使用 Android.Media.MediaPlayer 同时播放三个音轨

昨天我成功地做到了:

MediaPlayer track1 = MediaPlayer.create(this, R.raw.track1);
MediaPlayer track2 = MediaPlayer.create(this, R.raw.track2);
MediaPlayer track3 = MediaPlayer.create(this, R.raw.track3);

如您所见,我这里有 MediaPlayer 的三个不同的实例

因为我被要求这样做,所以我需要让这些 MediaPlayer后台线程中播放。

这是我启动 MediaPlayers 的部分:

//let's suppose this code snippet is in a run() method inside a Thread (which is the case)
track1.start();
track2.start();
track3.start();

如果我说昨天,那是因为第二天,它没有按预期工作。

确实,启动 MediaPlayer 似乎会停止之前播放的所有 MediaPlayer

我在调试器模式下进行了测试:很明显,track2.start() 停止了 track1 的 MediaPlayer,并且按照相同的模式,track3.start() 停止了 tack2 的 MediaPlayer。

所以最后,只播放了 track3,无论音量设置如何,我都听不到之前的任何轨道,而我之前可以清楚地听到所有轨道 :它应该创造某种氛围。

当然,更改轨道的开始顺序不会改变任何内容:只会听到最后一首轨道。

如果我说“听说”,那是因为在调试器模式下,检查属性 MediaPlayer.isPlaying 返回 true :所有三个玩家都在说他们正在玩,但只能听到一个人的声音......!

为什么要改变?为什么工作一次后就停止工作了?

注意:

  • 音频文件的时长都相同,大约为 15 分钟
  • 音频文件是压缩成.acc 文件的.mp3 文件(从320kbps144kbps)
  • 我在使用 C#Xamarin Studio 下工作,但为了清晰起见,我将坚持使用小的 Java 代码 fragment 。

编辑 1

根据这个Play two mp3 song at the same time我的解决方案应该有效,对吧?

最佳答案

我使用 CyclicBarrier 实例和内部类实现实现了您正在寻找的东西。

例子:

public enum MP_COMMAND {
START,
STOP,
PAUSE
}

/**
* Uses threads to execute synced commands for the current video media player and
* background music player in tandem.
*/
public void syncedCommand(MediaPlayer player1, MediaPlayer player2, MP_COMMAND command) {
final CyclicBarrier commandBarrier = new CyclicBarrier(2);
new Thread(new SyncedCommandService(commandBarrier, player1, command)).start();
new Thread(new SyncedCommandService(commandBarrier, player2, command)).start();
}

/**
* Inner class that starts a given media player synchronously
* with other threads utilizing SyncedStartService
*/
private class SyncedCommandService implements Runnable {
private final CyclicBarrier mCommandBarrier;
private MediaPlayerTest.MP_COMMAND mCommand;
private MediaPlayer mMediaPlayer;

public SyncedCommandService(CyclicBarrier barrier, MediaPlayer player, MediaPlayerTest.MP_COMMAND command) {
mCommandBarrier = barrier;
mMediaPlayer = player;
mCommand = command;
}

@Override public void run() {
try {
mCommandBarrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}

switch (mCommand) {
case START:
mMediaPlayer.start();
break;

case STOP:
mMediaPlayer.stop();
break;

case PAUSE:
mMediaPlayer.pause();
break;

default:
break;
}
}
}

您可以像这样使用它:

syncedCommand(mCurrentVideoPlayer, mBackgroundMusic, MP_COMMAND.START);

如果您要求它可用于任意数量的媒体播放器,您可以轻松实现它 - 我的要求只需要两个。

我意识到这个问题已经过时了,但是这个页面是我在寻找解决方案时找到的,所以我希望这对以后遇到这个问题的任何人有所帮助。

关于android - MediaPlayer同时播放多首歌曲 : only one is really playing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26379441/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com