无法使用 LibGDX 在 Android 上播放 2 个音乐实例

Posted

技术标签:

【中文标题】无法使用 LibGDX 在 Android 上播放 2 个音乐实例【英文标题】:Can't play 2 Music instances on Android with LibGDX 【发布时间】:2017-02-13 21:09:15 【问题描述】:

我正在 LibGDX 中制作游戏,我需要同时播放 2 首旋律。然而,在 android 上加载和播放 2 首旋律不起作用。这是我做的一个小测试。我什至尝试使用 LibGDX AssetManager 但仍然没有成功。

Music test1;
Music test2;

AssetManager manager = new AssetManager();

@Override public void create()

    manager.load(Melody.REVERSION.getPath(), Music.class);
    manager.load(Melody.COLLAPSE.getPath(), Music.class);

    while (!manager.update()) 
    manager.finishLoading();

    test1 = manager.get(Melody.REVERSION.getPath());
    test2 = manager.get(Melody.COLLAPSE.getPath());

    test1.setVolume(1);
    test1.play();
    test2.setVolume(1);
    test2.play();

【问题讨论】:

可能相关:gamedev.stackexchange.com/questions/104893/… 和 ***.com/questions/15742812/… 【参考方案1】:

我目前正在使用 SoundPool 库。 有了这个,我可以同时再现不同的音效,但我不知道这是否是最好的音乐方法。

帖子相关:Play sound using soundpool example

编辑 使用 MediaPlayer 和 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;
        
    

要播放两首歌曲,请调用:

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

syncedCommand(mCurrentVideoPlayer, mBackgroundMusic, MP_COMMAND.START);

参考:Playing multiple songs with MediaPlayer at the same time: only one is really playing

【讨论】:

声音和音乐在 LibGDX 中是不同的。声音已完全加载到内存中,并且可以播放任意数量的实例。但是,声音仅适用于 1 MB 以下的文件。您通常使用 Sound 来获得音效,例如枪声,但我需要使用 Music。音乐通过流式传输音乐文件的内容来工作。它在 Android 后端使用 MediaPlayer。音乐用于需要播放的较长歌曲。我需要同时播放 2 首歌曲,而不是 2 首声音。 啊,好吧,你可以试试使用 MediaPlayer,我读到这个:***.com/questions/26379441/… 或许可以帮助你。 如果执行MP_COMMAND.START并快速执行MP_COMMAND.PAUSE,如果最后一个动作没有完成所有线程怎么取消?

以上是关于无法使用 LibGDX 在 Android 上播放 2 个音乐实例的主要内容,如果未能解决你的问题,请参考以下文章

Libgdx 游戏在 Android 上崩溃

在 Android 上使用来自 libGDX 的 SQLite

LibGDX 多循环音效在桌面上工作,但在 Android 上不工作

Android 脚本层 - LibGDX

Libgdx 播放/暂停音乐

LibGDX:AudioFlinger 无法创建轨道,状态 -12