【问题标题】:MediaPlayer problem: all songs playing at the same timeMediaPlayer 问题:所有歌曲同时播放
【发布时间】:2020-09-29 22:35:58
【问题描述】:

所以我正在尝试播放用户选择的特定歌曲组合。我正在制作一个字符串数组,这些字符串是应该在 MediaPlayer 中播放的文件名。问题是所有歌曲同时播放。我已经尝试了所有方法,但仍然不知道如何确保播放器在开始另一首歌曲之前等待一首歌曲结束。

这是我尝试过的:

public void play(View v){

        if(player==null)
        {
            while(true) {
                if(i==brojac) break; //checking if the arraylist has ended
                if(player.isPlaying()==false) {
                    i++;
                    String s = lista.get(i).toString();
                    player = MediaPlayer.create(this, (this.getResources().getIdentifier(s, "raw", this.getPackageName())));
                    player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                        @Override
                        public void onCompletion(MediaPlayer mediaPlayer) {
                            stopPlayer();
                        }
                    });
                    player.start();
                }
            }
        }

    }
private void stopPlayer()
    {
        if(player!=null)
        {
            player.release();
            player=null;
        }
    }

编辑

下面的答案一切正常,但玩家有明显的差距。我已经用 setNextPlayer() 函数解决了这个问题,但是由于在播放时重新创建播放器,应用程序崩溃了。

void playSong(int currentSong) {
        player = MediaPlayer.create(this, currentSong);
        player1 = MediaPlayer.create(this,this.getResources().getIdentifier(lista.get(i+1).toString(),"raw",getPackageName()));
        player.setNextMediaPlayer(player1);
        player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                player.release();
                i++;
                if(i==brojac) return;
                player1.start();
                playSong(MainActivity.this.getResources().getIdentifier(lista.get(i).toString(),"raw",getPackageName()));
            }
        });
        if(i==0) {
            player.start();
        }
    }

【问题讨论】:

    标签: java android android-mediaplayer windows-media-player


    【解决方案1】:

    我相信你想要这个:

    ArrayList<Integer> songs = new ArrayList<>();
        private MediaPlayer mediaPlayer;
        private int currentIndex = 0;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            Field[] fields = R.raw.class.getFields();
            for (Field field : fields)
                songs.add(getResources().getIdentifier(field.getName(), "raw", getPackageName()));
            playSong(songs.get(currentIndex));
    
        }
    
    
        void playSong(int currentSong) {
            mediaPlayer = MediaPlayer.create(this, currentSong);
            mediaPlayer.setOnCompletionListener(completeListener);
            mediaPlayer.start();
        }
    
        MediaPlayer.OnCompletionListener completeListener = mp -> {
            mp.release();
            currentIndex++;
            playSong(songs.get(currentIndex));
        };
    

    说明:

    下面的代码,将从raw文件夹中获取所有的音频文件,并将它们存储在名为songs的ArrayList中:

     Field[] fields = R.raw.class.getFields();
     for (Field field : fields)
                songs.add(getResources().getIdentifier(field.getName(), "raw", getPackageName()));
    

    播放歌曲:

    void playSong(int currentSong) {
            mediaPlayer = MediaPlayer.create(this, currentSong);
            mediaPlayer.setOnCompletionListener(completeListener);
            mediaPlayer.start();
        }
    

    OnCompletionListener 听众,当歌曲结束时,您需要增加 currentIndex 以便 songs.get(currentIndex) 会给您下一首歌曲

    MediaPlayer.OnCompletionListener completeListener = mp -> {
            mp.release();
            currentIndex++;
            playSong(songs.get(currentIndex));
        };
    

    【讨论】:

    • 是的,非常感谢,这解决了我同时播放所有歌曲的问题。但是播放器停止和再次开始播放另一首歌曲之间存在非常明显的差距,有没有办法更有效地做到这一点..?
    • 你好,我没有遇到过这种问题,其实是为了测试代码,我用的是短铃声,确保差距不是来自歌曲本身,否则如果你没有介意把你的歌名分享给我,我会下载它们并再次测试代码
    • 我亲自制作了我的短片,这些短片实际上是吉他上以某种节奏弹奏的和弦,我大胆地剪辑了它们,所以肯定不会有延迟。我已经设法通过使用 setNextMediaPlayer(player1) 和 player1=MediaPlayer.create(next song),然后在 OnComplition 方法中使用 player1.start() 来消除这种延迟,但是由于返回到 playSong 时的递归, player1 正在播放,同时我正在重新创建它,它崩溃了,但没有间隙......我不知道如何解决这个问题,我将进行编辑以显示代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-23
    • 1970-01-01
    相关资源
    最近更新 更多