Android Studio媒体播放器如何淡入和淡出

我正在使用 android studio 中的 mediaplayer 类。我只是想淡出一个声音并淡入另一个声音,而不是使用 setVolume(0,0)和 setVolume(1,1)。

我正在使用 android studio 中的 mediaplayer 类。我只是想淡出一个声音并淡入另一个声音,而不是使用 setVolume(0,0)和 setVolume(1,1)。

我为此创建了两个媒体播放器,似乎我在这个线程中找到了一个解决方案:Android: How to create fade-in/fade-out sound effects for any music file that my app plays?但我不知道如何使用 deltaTime。

还有一些其他的解决方案,我几乎无法理解。没有一个简单的方法来交叉淡入淡出两个 mediaplayers,我无法想象没有人需要这个,或者每个人都使用痴迷的代码来实现它。以及我应该如何使用 deltaTime?

19

查看链接的example,您必须在循环中调用 fadeIn()/ fadeOut(),以在一段时间内增加 / 减少音量。deltaTime将是循环的每次迭代之间的时间。

您必须在主 UI 线程的单独线程中执行此操作,因此您不会阻止它并导致应用程序崩溃。您可以通过将此循环放入新的 Thread / Runnable / Timer 中来做到这一点。

这是我的例子淡入(你可以做一个类似的事情淡出):

float volume = 0;
private void startFadeIn(){
    final int FADE_DURATION = 3000; //The duration of the fade
    //The amount of time between volume changes. The smaller this is, the smoother the fade
    final int FADE_INTERVAL = 250;
    final int MAX_VOLUME = 1; //The volume will increase from 0 to 1
    int numberOfSteps = FADE_DURATION/FADE_INTERVAL; //Calculate the number of fade steps
    //Calculate by how much the volume changes each step
    final float deltaVolume = MAX_VOLUME / (float)numberOfSteps;
    //Create a new Timer and Timer task to run the fading outside the main UI thread
    final Timer timer = new Timer(true);
    TimerTask timerTask = new TimerTask() {
        @Override
        public void run() {
            fadeInStep(deltaVolume); //Do a fade step
            //Cancel and Purge the Timer if the desired volume has been reached
            if(volume>=1f){
                timer.cancel();
                timer.purge();
            }
        }
    };
    timer.schedule(timerTask,FADE_INTERVAL,FADE_INTERVAL);
}
private void fadeInStep(float deltaVolume){
    mediaPlayer.setVolume(volume, volume);
    volume += deltaVolume;
}

而不是使用两个单独的 MediaPlayer 对象,我会在你的情况下只使用一个,并在淡入淡出之间交换轨道。

**Audio track #1 is playing but coming to the end**
startFadeOut();
mediaPlayer.stop();
mediaPlayer.reset();
mediaPlayer.setDataSource(context,audiofileUri);
mediaPlayer.prepare();
mediaPlayer.start();
startFadeIn();
**Audio track #2 has faded in and is now playing**

希望这能解决你的问题。

2

这是淡出代码,以防它为某人节省一些时间。

这还包括一个 stopPlayer () 函数,用于从内存中释放 MediaPlayer。

// Set to the volume of the MediaPlayer
float volume = 1;
private void startFadeOut(){
    // The duration of the fade
    final int FADE_DURATION = 3000;
    // The amount of time between volume changes. The smaller this is, the smoother the fade
    final int FADE_INTERVAL = 250;
    // Calculate the number of fade steps
    int numberOfSteps = FADE_DURATION / FADE_INTERVAL;
    // Calculate by how much the volume changes each step
    final float deltaVolume = volume / numberOfSteps;
    // Create a new Timer and Timer task to run the fading outside the main UI thread
    final Timer timer = new Timer(true);
    TimerTask timerTask = new TimerTask() {
        @Override
        public void run() {
            //Do a fade step
            fadeOutStep(deltaVolume);
            //Cancel and Purge the Timer if the desired volume has been reached
            if(volume <= 0){
                timer.cancel();
                timer.purge();
                stopPlayer();
            }
        }
    };
    timer.schedule(timerTask,FADE_INTERVAL,FADE_INTERVAL);
}
private void fadeOutStep(float deltaVolume){
    player.setVolume(volume, volume);
    volume -= deltaVolume;
}
// Release the player from memory
private void stopPlayer() {
    if (player != null) {
        player.release();
        player = null;
    }
}
2

在 API 级别 26 (https://developer.android.com/guide/topics/media/volumeshaper) 中添加了一个 VolumeShaper 类。这是一个音量输出和输入的示例,您可以对淡入或淡出速度 (ramp) 进行整形,向时间和音量数组添加更多的点。时间点必须从 0 开始,到 1 结束,它们是音量渐变的相对时间。

fun fadeOutConfig(duration: Long): VolumeShaper.Configuration {
        val times = floatArrayOf(0f, 1f) // can add more points, volume points must correspond to time points
        val volumes = floatArrayOf(1f, 0f)
        return VolumeShaper.Configuration.Builder()
            .setDuration(duration)
            .setCurve(times, volumes)
            .setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_CUBIC)
            .build()
    }
fun fadeInConfig(duration: Long): VolumeShaper.Configuration {
    val times = floatArrayOf(0f, 1f) // can add more points, volume points must correspond to time points
    val volumes = floatArrayOf(0f, 1f)
    return VolumeShaper.Configuration.Builder()
        .setDuration(duration)
        .setCurve(times, volumes)
            .setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_CUBIC)
            .build()
}
fun fadeInOrOutAudio(mediaPlayer: MediaPlayer, duration: Long, out: Boolean) {
    val config = if (out) fadeOutConfig(duration) else fadeInConfig(duration)
    val volumeShaper = mediaPlayer.createVolumeShaper(config)
    volumeShaper.apply(VolumeShaper.Operation.PLAY)
}
0
private void fadeOut() {
    final long steps = 30;
    final double stepWidth = (double) 1 / steps;
    mFadeOutCriteria = 1;
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            mFadeOutCriteria -= stepWidth;
            mediaPlayer.setVolume(mFadeOutCriteria, mFadeOutCriteria);
            if (mFadeOutCriteria <= 0) {
                mediaPlayer.stop();
                nextrunq();
                mFadeOutCriteria = 0;
                handler.removeCallbacks(this);
            } else
                handler.postDelayed(this, 100);
        }
    }, 100);
}

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(502)
如何确定节点中用户的 IP地址
上一篇
如何在AndroidN+ 中禁用活动的多窗口模式
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(57条)