Java Android-创建循环垫音乐应用程序的信息

Java Android-创建循环垫音乐应用程序的信息,java,android,audio,synchronization,Java,Android,Audio,Synchronization,我想创建一个音乐循环垫,类似这样: 现在,我正在使用MediaPlayer播放声音。我有一个全局变量,它存储正在播放的第一个音频的当前时间(位置),当我按下另一个按钮时,相应的音频文件将在全局变量给定的位置开始播放 我的问题是:声音不同步 你能给我一些帮助吗?如何同步声音?喜欢这个应用吗 你能告诉我一些关于如何创建循环焊盘的信息或教程吗 谢谢 理查德编写这样的程序比你想象的要难。要使声音同步播放,您必须做以下两件事: 确保所有声音的节拍都相同,并且裁剪正确-这意味着声音剪辑的开始和结束必须完全

我想创建一个音乐循环垫,类似这样:

现在,我正在使用MediaPlayer播放声音。我有一个全局变量,它存储正在播放的第一个音频的当前时间(位置),当我按下另一个按钮时,相应的音频文件将在全局变量给定的位置开始播放

我的问题是:声音不同步

你能给我一些帮助吗?如何同步声音?喜欢这个应用吗

你能告诉我一些关于如何创建循环焊盘的信息或教程吗

谢谢
理查德

编写这样的程序比你想象的要难。要使声音同步播放,您必须做以下两件事:

  • 确保所有声音的节拍都相同,并且裁剪正确-这意味着声音剪辑的开始和结束必须完全符合节拍-另一个解决方案是存储每个剪辑的开始和结束时间(OOP非常简单)

  • 使用计时器确保声音开始按节拍播放。例如,如果你想让你的音乐以120 bpm的速度运行,你需要让计时器每500毫秒启动一次

  • 下面是一些代码(只是概念,不会编译):

    Timer beatTimer;
    boolean isDrumLoopEnabled;
    boolean isDrumLoopCurrentlyPlaying;
    Sound drumloop;
    
    public void startMusic(){
        //prepare timer
        beatTimer=new Timer();
        beatTimer.interval=500;//for 120 bpm
        beatTimer.onTick+=onTickHandler;
    
        isDrumLoopPlaying=false;
        isDrumLoopCurrentlyPlaying=false;
    
        //load sounds
        Sound drumloop=new Sound("/storage/emulated/drumloop.ogg");
    
        //start music
        beatTiemr.start();
    }
    
    //this method will run on every beat:
    public void onTickHandler(){
        if(isDrumLoopEnabled){
            //make sure drum loop isn't already playing
            if(!isDrumLoopCurrentlyPlaying){
                //begin looping drumloop in background
                drumloop.startloop();
                isDrumLoopCurrentlyPlaying=true;
            }
        }else{
            if(isDrumLoopCurrentlyPlaying){
                //stop playing drumloop
                drumloop.stopPlaying();
            }
        }
    }
    
    //when the button is pressed...
    public void drumloop_buttonpressed(){
        //this will toggle whether to play the drum loop:
        isDrumLoopEnabled=!isDrumLoopEnabled;
    }