如何逐渐加快 Android 中的声音播放速度?

Posted

技术标签:

【中文标题】如何逐渐加快 Android 中的声音播放速度?【英文标题】:How to Gradually Accelerate Sound Playing Speed in Android? 【发布时间】:2020-04-05 11:01:16 【问题描述】:

我想播放一个会逐渐加快播放速度的声音,即第一次播放 1x 速度,然后 1.5x 速度,然后 2.0x 速度,然后 3.5x,4x,......类似的东西。我试着写了一些代码,比如:

        MediaPlayer mp;
        float mpDrumFreq = 0f;
        float frequency = 1f;

        mp = MediaPlayer.create(MainActivity.this, R.raw.tiktok);
        mp.setLooping(true);
        mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() 
            @Override
            public void onCompletion(MediaPlayer mp) 
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 
                    mpDrumFreq = Math.min(10f, (mpDrumFreq+frequency) );
                    mp.setPlaybackParams(mp.getPlaybackParams().setSpeed(mpDrumFreq));
                
            
        );

        TextView play = findViewById(R.id.play);

        play.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                mp.start();
            
        );

在这里,MediaPlayer mp 播放声音。我正在尝试使用这条线 mp.setPlaybackParams(mp.getPlaybackParams().setSpeed(newSpeed)); 提高 setOnCompletionListener 内的速度 我还有一些其他的变化。但它没有用。我不知道为什么。有谁知道怎么做?

在这种情况下,我尝试使用 MediaPlayer,但可以随意提出任何建议,例如 SoundPool 或其他一些库。 谁能帮帮我?

【问题讨论】:

【参考方案1】:

您可以尝试使用 SoundPool:

private static SoundPool sound;
private static SparseIntArray soundPoolMap = new SparseIntArray();
...
// 1 - use one thread
sound = new SoundPool(1, AudioManager.STREAM_MUSIC, 100);
soundPoolMap.put(0, sound.load(application, R.raw.sound, 0));
...
// last parameter - rate of sound
sound.play(soundPoolMap.get(0), 1.0f, 1.0f, 0, 0, 1f);

但正如 Howard Liu here 所写,SoundPool 没有 setOnCompletionListener() 并建议使用 custom class。

【讨论】:

以上是关于如何逐渐加快 Android 中的声音播放速度?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Android 动画播放“滴答滴答”声音(可能使用“Android MediaPlayer / SoundPool”)?

如何在 soundPool (Android) 中逐渐加载声音?

倒带 30 秒音频并以 2 倍速度播放

Android自助餐之SoundPool

滚动视图滚动时如何播放取决于滚动视图滚动速度的声音?

IOS Audio - 加快音乐播放速度