【问题标题】:How to play several tracks simultaneously, using MediaPlayer?如何使用 MediaPlayer 同时播放多个曲目?
【发布时间】:2014-01-23 16:09:52
【问题描述】:

我有 8 个 mp3 文件。而且我必须同时播放它(几乎不会。肯定会)
我正在使用“AudaCity”来控制精度。但是我的代码没有给我想要的结果...
(异步 = 30~90 毫秒)
所以,这是我的代码:
(第一次开始玩)

public void start() {
//songInfo.getMediaPlayer() - it's array of MediaPlayers, source already setted
        for (MediaPlayer player : songInfo.getMediaPlayer()) {
            try {
                if (player != null) {
                    player.prepare();
                    player.seekTo(0);
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }       
        }
        songInfo.getMediaPlayer()[0]
                .setOnCompletionListener(new OnCompletionListener() {
                        @Override
                        public void onCompletion(MediaPlayer mp) {
                            //code for play next setlist
                        }
        });
        resume();
}

(暂停)

public void pause() {
        for (MediaPlayer player : songInfo.getMediaPlayer()) {
            if (player != null)
                player.pause();
        }
}

(用于暂停后继续播放,用于开始播放(用于第一种方法))

public void resume() {  
        int pos = songInfo.getMediaPlayer()[0].getCurrentPosition();
        long iTime = System.currentTimeMillis();
        for (MediaPlayer player : songInfo.getMediaPlayer()) {
            if (player != null) {
                player.seekTo(pos + (int)(System.currentTimeMillis()-iTime));
                player.start();
            }
        }
}

如果我第一次开始玩,它会给我带来异步 ~ 30ms+
然后在暂停/恢复后播放完美。

【问题讨论】:

    标签: android android-mediaplayer


    【解决方案1】:

    经过大量研究,问题解决了。 要同时播放多个曲目,您应该使用AsyncTask 并在 THREAD_POOL_EXECUTOR 上执行它。
    如何做到这一点:
    线程类

    class PlayThread extends AsyncTask<MediaPlayer, Void, Void>
    {
        @Override
        protected Void doInBackground(MediaPlayer... player) {
    
            player[0].start();          
            return null;
        }
    }
    

    媒体播放器

    MediaPlayer[] players = new MediaPlayer[5];
    //Then set source to each player...
    //...
    //Create objects of Thread class
    PlayThread[] playThreads = new PlayThread[5];
    for (int i = 0; i < 5; i++)
        playThreads[i] = new PlayThread();
    //Set Media Players there and start play
    for (int i = 0; i < 5; i++)
        playThreads[i].executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, players[i]);
    

    AsyncTask只能同时执行5个线程,其他的要排队。


    SoundPool 缓冲区限制为 1Mb,因此根本不是解决方案。


    这很重要:
    要同时播放更多音轨,您应该将它们混合到 1 个缓冲区中。
    实现方式:将mp3解码为pcm(流模式下到小缓冲区),混合成一个字节的缓冲区,放到AudioTrack播放。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-02
    • 2018-03-14
    相关资源
    最近更新 更多